2016-02-27 102 views
0

我正嘗試在我的太空船遊戲的屏幕上創建一個遊戲,當玩家的盾牌達到0時,它會轉到屏幕上的遊戲並停止遊戲。遊戲在屏幕上工作,但我無法停止遊戲。當玩家的盾牌達到0時,我試圖將Ship設置爲null,但是我得到了1009的錯誤。當公共函數fGameStart(evt:Event):void { 「執行,有沒有辦法阻止這個功能在遊戲結束時運行?任何幫助是極大的讚賞!AS3調試時出現錯誤1009

public class Engine extends MovieClip { 
    private var preloader: ThePreloader; 

    public function Engine() { 
     stage.addEventListener("gameSTART", fGameStart); 
     stage.addEventListener("gameOVER", fGameOver); 
    } 

    private var numStars: int = 80; 
    public static var enemyList: Array = new Array(); 
    private var ourShip: Ship; 

    public function fGameStart(evt: Event): void { 

     ourShip = new Ship(stage); 
     ourShip.x = stage.stageWidth/2; 
     ourShip.y = stage.stageHeight/2; 
     ourShip.addEventListener("hit", shipHit, false, 0, true); 
     stage.addChild(ourShip); 

     for (var i: int = 0; i < numStars; i++) { 
      stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip)); 
     } 

     addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 

     function loop(e: Event): void { 

      if (Math.floor(Math.random() * 20) == 5) { 
       var enemy: Stinger = new Stinger(stage, ourShip); 
       enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true); 
       enemy.addEventListener("killed", enemyKilled, false, 0, true); 
       enemyList.push(enemy); 
       stage.addChild(enemy); 
      } 

      else if (Math.floor(Math.random() * 80) == 5) { 
       var enemy2: Stinger2 = new Stinger2(stage, ourShip); 
       enemy2.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true); 
       enemy2.addEventListener("killed", enemyKilled, false, 0, true); 
       enemyList.push(enemy2); 
       stage.addChild(enemy2); 
      } 
     } 
    } 

    public function fGameOver(e: Event) { 
     gotoAndStop(4); 
     ourShip = null; 
    } 


} 

回答

0

是毫無意義的ourShip變量設置爲null。它不會從stage中刪除DisplayObject,或將其從內存中刪除。事實上,你得到這個錯誤的原因是你將它設置爲null

您需要做的是停止觸發的loop功能。

public function fGameOver(e: Event) { 
    gotoAndStop(4); 
    //ourShip = null; 
    stage.removeChild(ourShip); 
    removeEventListener(Event.ENTER_FRAME, loop); 
} 

還設置你弱引用聽衆可能會在這裏一個壞主意

//addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
//why not: 
addEventListener(Event.ENTER_FRAME, loop); 
+0

非常感謝,它的工作原理! –

+0

如果函數「public function fGameStart(evt:Event):」包含其他遊戲對象,我該如何刪除整個函數?我試過 「removeEventListener(」gameSTART「,GameStart);」但它沒有奏效。 –

+0

你不能刪除函數,它們在可能時被垃圾回收/閃存感覺就像它 –