2012-03-13 73 views
0

我在做flash平臺遊戲。製作平臺遊戲,需要停止運行的方法

我有一個目標類(包含目標精靈代碼的類,當你點擊它時,它繼續到遊戲的下一部分)。

裏面的目標構造,加入2個事件偵聽器,有如下幾點:

addEventListener(Event.ADDED, beginClass); 
addEventListener(Event.ENTER_FRAME, eFrame); 

的beginClass功能是好的,只運行一次,但eFrame是什麼檢查,如果玩家擊中目標,所以它不斷運行。問題在於,一旦玩家擊中了目標,eFrame將繼續運行,而在菜單中描述玩家的下一個場景。我的eFrame功能如下。

private function eFrame(event:Event):void{ 
     if(hitTestObject(_root.mcMain)){ 
      var lastScore:int = _root.mainScore; 
      _root.mainScore = lastScore; 
      while (_root.lvlHolder.numChildren > 0) { 
        _root.lvlHolder.removeChildAt(0); 
      } 
      _root.mcMain.removeChildAt(0); 
      _root.isInCut = true; 
      if (_root.lvlCurrent == 1) { 
       _root.gotoAndStop(2); 
      } else if (_root.lvlCurrent == 2) { 
       _root.gotoAndStop(3); 
      } else if (_root.lvlCurrent == 3) { 
       _root.gotoAndStop(4); 
      } 
     } 
    } 

第2,3,4幀是隻有文本和向玩家顯示消息的按鈕,然後玩家繼續播放。我的問題是,eFrame仍在嘗試運行,但該類尚未實例化,並且一旦玩家繼續,該方法會造成極大的延遲。

回答

0

內部eFrame()停止事件偵聽器:

removeEventListener(Event.ENTER_FRAME,eFrame);

+0

我做到了,但它仍然在做。當我到第2幀時,第1幀的代碼不能正確運行?因爲這是調用目標類的地方。 – Darren 2012-03-13 20:30:15

0

您要添加事件監聽到舞臺這麼試試這個:

stage.removeEventListener(Event.ENTER_FRAME, eFrame); 

parent.removeEventListener(Event.ENTER_FRAME, eFrame); 

event.target.removeEventListener(Event.ENTER_FRAME, eFrame); 
2

內的目標,什麼是_root的地步?

反正這裏是我做了什麼: 事件更改ADDEDADDED_TO_STAGE,這樣一來,當事件被觸發,我們知道這個雪碧有stage屬性。

addEventListener(Event.ADDED_TO_STAGE, beginClass); 

從構造函數中刪除eFrame事件。將它添加到beginClass,與stage,就像這樣:

stage.addEventListener(Event.ENTER_FRAME, eFrame); 

現在eFrame,您可以赫然刪除與臺架基準事件。它之前沒有工作,因爲參考是錯誤的(不管它是與_root變量)。

stage.removeEventListener(Event.ENTER_FRAME, eFrame); 

但是 - 記住你的這部分代碼之前做到這一點:

while (_root.lvlHolder.numChildren > 0) { 
    _root.lvlHolder.removeChildAt(0); 
} 

因爲當精靈被刪除,它不會有stage財產了。請記住在所有可能的情況下清理事件。我不完全確定stage是放置您的輸入框架事件的正確位置,因爲您之前稱爲_root的原因,我只是這麼認爲。