簡體   English   中英

如何卸載外部“ .swf”文件來加載另一個文件?

[英]How do I unload an external “.swf” file to load another?

我是一個在游戲上工作了幾個月的學生,現在我陷入了一個問題。 我是ActionScript 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();

    }

我相信您應該能夠在相同的加載器對象上啟動新請求。 無論哪種方式,您都在處理對象創建和清理。 我提供的解決方案的關鍵是您可以重復使用裝載機。

您當前的代碼有些重復,因此我對其進行了一些修改,以演示如何簡化代碼。 查看代碼時的一些想法:

  • 您要多次向舞台添加同一對象(即,MenuStart,MenuStory,MenuInstructions); 這些都是指向您加載的同一根swf的指針(也稱為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);
    }
}

我要犯的最后一件事是告訴您如何運行您的項目,但是,我認為您在這里可能采用了錯誤的方法。

與其將故事和游戲設置為單獨的swf文件,您可能需要做的是將故事設置為MovieClip,將游戲設置為MovieClip。 (是的,MovieClips可以包含其他符號,包括其他MovieClips。)然后,您將需要使用代碼從舞台中隱藏/顯示或添加/刪除這些MovieClips。

如果您需要知道如何執行此操作,請讓我給您一個古老的建議:RTD(請閱讀文檔)。 這些是在線Adobe Flash文檔以及眾多在線教程中介紹的基本任務。

希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM