如何卸载外部“.swf”文件以加载另一个?

时间:2014-01-06 20:56:11

标签: actionscript-3 flash external

我是一名在游戏中工作数月的学生,现在我遇到了问题。 我是动作脚本3的新手,但我学得很快。

我可以自动将菜单屏幕(“startScreen.swf”)加载到我的游戏(firstgame)中,当我点击play或storyScreen或instructionsScreen时,一切正常。但问题是我想按 ESC 按钮后返回。我尝试过很多代码,但没有任何代码可以完全按照我的意

示例:我点击故事和swf(storyScreen.swf)加载,我可以阅读故事,当我完成后,我想按 ESC 重新加载我的swf(startScreen.swf )及其中的所有功能。喜欢游戏和说明。

您可以在函数(esc)中找到我的代码和空白区域。

我知道这可能很容易解决,但我真的不知道如何解决。 :(

public class FirstGame extends MovieClip
{

    public var Player:MovieClip

    private var leftKeyIsDown:Boolean;
    private var RightKeyIsDown:Boolean;

    private var aMissileArray:Array;
    private var aEnemyArray:Array;

    public var scoreTxt:TextField;
    public var ammoTxt:TextField;
    public var MenuEnd:EndGameScreen;
    public var menuAgain:EndGameScreen;

    private var MenuStart:mcStartGameScreen;
    private var MenuStory:mcStartGameScreen;
    private var MenuInstructions:mcStartGameScreen;

    private var nScore:Number;
    private var nAmmo:Number;
    private var tEnemyTimer:Timer;


    public function FirstGame() 
    {
        //Create a loader object
        var startLoader:Loader = new Loader();
        //add event listener to listen for the complete event
        startLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startLoaded);
        //load our loader object
        startLoader.load(new URLRequest("startScreen.swf"));
    }

    public function startLoaded(e:Event):void 
    {
        MenuEnd.hideScreen();
        Player.visible = false;
        scoreTxt.visible = false;
        ammoTxt.visible = false;

        //get a reference to the loaded movieclip
        MenuStart = e.target.content as mcStartGameScreen;
        //listen for start game event
        MenuStart.addEventListener("START_GAME", playGameAgain);
        //add it to the stage
        addChild(MenuStart);

        //get a reference to the loaded movieclip
        MenuStory = e.target.content as mcStartGameScreen;
        //listen for start game event
        MenuStory.addEventListener("SHOW_STORY", storyGameScreen);
        //add it to the stage
        addChild(MenuStory);

        //get a reference to the loaded movieclip
        MenuInstructions = e.target.content as mcStartGameScreen;
        //listen for start game event
        MenuInstructions.addEventListener("SHOW_INSTRUCTIONS", instructionsGameScreen);
        //add it to the stage
        addChild(MenuInstructions);
    }

    private function instructionsGameScreen(e:Event):void 
    {
        var instructionsLoader:Loader = new Loader();
        var url:URLRequest = new URLRequest("instructionsScreen.swf");
        instructionsLoader.load(url);
        addChild(instructionsLoader);

        stage.addEventListener(KeyboardEvent.KEY_UP, esc);
    }

    private function storyGameScreen(e:Event):void 
    {
        var storyLoader:Loader = new Loader();
        var url:URLRequest = new URLRequest("storyScreen.swf");
        storyLoader.load(url);
        addChild(storyLoader);

        stage.addEventListener(KeyboardEvent.KEY_UP, esc);
    }

    private function esc(e:KeyboardEvent):void 
    {
        if (e.keyCode == 27) 
        {
            //fscommand("quit");

            /////////test//////////////////(new URLRequest(stage.loaderInfo.url), "FirstGame.swf");

        }
    }


    private function playGameAgain(e:Event):void 
    {

        //initialize variables
        aMissileArray = new Array();
        aEnemyArray = new Array();
        nScore = 0;
        nAmmo = 20;
        Player.x = 262,95
        Player.y = 323,30

        Player.visible = true;
        scoreTxt.visible = true;
        ammoTxt.visible = true;

        MenuStart.hideScreen();


        MenuEnd.addEventListener("PLAY_AGAIN", playGameAgain);
        MenuEnd.hideScreen();

        updateScoreText();
        updateAmmoText();

        //trace("First Game Loaded");
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);

        stage.addEventListener(Event.ENTER_FRAME, gameLoop)

        //creat an timer object
        tEnemyTimer = new Timer(1000)
        //listen for the timer ticks/intervals
        tEnemyTimer.addEventListener(TimerEvent.TIMER, addEnemy)
        //start our timer
        tEnemyTimer.start();

    }

2 个答案:

答案 0 :(得分:1)

我相信您应该能够在同一个加载器对象上启动新请求。无论哪种方式,您都在处理对象创建和清理。我提供的解决方案的关键是你重复使用你的装载机。

您当前的代码有些重复,因此我稍作修改,以演示如何简化代码。审核您的代码时的一些想法:

  • 您多次向舞台添加相同的对象(即。 MenuStart,MenuStory,MenuInstructions);这些都是指向 你加载的同一个swf(a.k.a.,startLoader)。
  • 您已在多个地点注册了舞台活动。最好 练习是将它们放在构造函数中 持久性。
  • 因为你想在以后重复使用你的加载器,所以保持一个 使用它们的表格可以更容易引用。
  • 每当你发现自己以类似的方式编写相同的代码时, 它是一个很好的迹象,表明您可以通过单一功能进行简化 (只需更改参数)。

尝试一下:

public var Player:MovieClip

private var leftKeyIsDown:Boolean;
private var RightKeyIsDown:Boolean;

private var aMissileArray:Array;
private var aEnemyArray:Array;

public var scoreTxt:TextField;
public var ammoTxt:TextField;
public var MenuEnd:EndGameScreen;
public var menuAgain:EndGameScreen;

private var MenuStart:mcStartGameScreen;
private var MenuStory:mcStartGameScreen;
private var MenuInstructions:mcStartGameScreen;

private var nScore:Number;
private var nAmmo:Number;
private var tEnemyTimer:Timer;

private var screens:Object = {
    "SHOW_INSTRUCTIONS":{
        "loader":new Loader(),
        "url":new URLRequest("instructionsScreen.swf")
    },
    "SHOW_STORY":{
        "loader":new Loader(),
        "url":new URLRequest("storyScreen.swf")
    },
    "START_GAME":{
        "loader":new Loader(),
        "url":new URLRequest("startScreen.swf")
    }
}

public function FirstGame() {
    var startLoader:Loader = loadScreen({"type":"START_GAME"});
    //Register our event listeners
    startLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startLoaded);
    stage.addEventListener(KeyboardEvent.KEY_UP, esc);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
    stage.addEventListener(Event.ENTER_FRAME, gameLoop)
}

private function loadScreen(e:Object):Loader {
    screens[e.type].loader.load(screens[e.type].url);
    addChild(screens[e.type].loader);
    return screens[e.type].loader;
}

public function startLoaded(e:Event):void {
    //initialize variables
    aMissileArray = new Array();
    aEnemyArray = new Array();
    nScore = 0;
    nAmmo = 20;
    Player.x = 262, 95
    Player.y = 323, 30
    Player.visible = true;
    scoreTxt.visible = true;
    ammoTxt.visible = true;
    MenuEnd.addEventListener("PLAY_AGAIN", playGameAgain);
    MenuEnd.hideScreen();
    updateScoreText();
    updateAmmoText();

    //creat an timer object
    tEnemyTimer = new Timer(1000)
    tEnemyTimer.addEventListener(TimerEvent.TIMER, addEnemy)
    tEnemyTimer.start();

    var swfRoot = screens.START_GAME.loader["content"];
    swfRoot.addEventListener("START_GAME", loadScreen);
    swfRoot.addEventListener("SHOW_STORY", loadScreen);
    swfRoot.addEventListener("SHOW_INSTRUCTIONS", loadScreen);
}

private function esc(e:KeyboardEvent):void {
    if (e.keyCode == 27) {
        //fscommand("quit");

        // Loop through our loaders, and reset them all.
        for each (var entry:Object in screens) {
            entry.loader.unloadAndStop();
            removeChild(entry.loader);
        }

        // Reload the start screen
        var startLoader:Loader = loadScreen({"type":"START_GAME"});
        startLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startLoaded);
    }
}

答案 1 :(得分:0)

我想要犯的最后一件事就是告诉你如何运行你的项目,但是,我认为你可能采取了错误的方法,在这里。

不是将故事和游戏设置为单独的swf文件,您可能需要做的是将故事设置为MovieClip,将游戏设置为MovieClip。 (是的,MovieClips可以包含其他符号,包括其他MovieClip。)然后,您将要使用代码隐藏/显示或添加/删除舞台上的这些MovieClip。

如果你需要知道如何做到这一点,让我给你一个古老的警告:RTD(阅读文档)。这些是在线Adobe Flash文档和在线许多教程中涵盖的基本任务。

我希望有所帮助!