2012-03-13 70 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的原因,我只是这么认为。