2014-01-06 120 views
1

我是一個在遊戲上工作數月的學生,現在我遇到了問題。 我是新來的動作3,但我學得快。如何卸載外部「.swf」文件以加載另一個文件?

我可以自動加載我的菜單屏幕(「startScreen.swf」)到我的遊戲(firstgame),當我點擊播放或storyScreen或instructionsScreen一切工作正常。但問題是我想要按下ESC按鈕後才能返回。我已經嘗試了很多代碼,但沒有任何工作正是我想要的。

例子:我點擊故事和SWF(storyScreen.swf)負載,我可以讀這個故事,當我完了,我想按ESC 我重新加載瑞士法郎(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(); 

    } 

回答

0

的最後一件事我想犯不過是告訴你如何運行你的項目,我覺得你可能會採取錯誤的做法,在這裏。

而不是建立故事和遊戲作爲單獨的swf文件,您可能需要做的就是將故事設置爲MovieClip,將遊戲設置爲MovieClip(是的,MovieClips可以包含其他符號,包括其他的影片剪輯)。然後,您如果你需要知道如何做到這一點會想隱藏/顯示或添加/使用代碼刪除您的階段,這些影片剪輯。

,讓我給你古老的告誡:RTD(閱讀文檔)。這些都是在線Adobe Flash文檔以及在線的衆多教程中涵蓋的基本任務。

我希望有幫助!

+1

我知道這是不是最好的方法,我可以採取不同的方式,但我不希望它影響到很多的比賽,我現在所擁有的。我所要做的就是讓正確的命令返回到我的啓動畫面。 但我會閱讀文檔,如果有其他更簡單的方法給出。 畢竟謝謝! –

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); 
    } 
} 
+0

它似乎是一個很好的解決方案。但我有一些問題。有了第一個對象(屏幕),你能給我一個其他代碼的例子,因爲這個例子似乎沒有足夠的信息,我似乎無法找到正確的方式來使用它沒有錯誤。 還是謝謝! –

+0

我的不好,我忘了在對象後面加var前綴。也就是說,如果你試圖調試代碼(沒有剩下的項目文件就不能做),一定要啓用「允許調試」並以調試模式運行(control-shift-enter)。這會給你簡要的信息,說明你的代碼在哪裏以及如何遇到問題。 – Atriace

+0

好的,我改變了我的代碼。但使用加載屏幕功能時,我需要在「e」之後輸入我的類型。那部分對我來說並不清楚。我需要填寫「target.content」嗎? 如果它讓你更容易,我會給出一個鏈接來下載我的文件。 https://www.mediafire.com/folder/9lidtt6dsbcdq/My%20Game 我希望我不會煩你,但如果你能解決這個問題,我會永遠感謝你! –