AS3-通过功能更改场景时从舞台中删除子节目

时间:2015-03-16 00:53:22

标签: function actionscript-3 timer removechild scene

我目前正在制作一款游戏,其中玩家控制射击敌舰的宇宙飞船。我已经为场景添加了一个计时器,以便在60秒后“母船”的影片剪辑爆炸并消失。然而,当这种情况发生时,我想转移到一个不同的场景作为一个“完整的”场景,但是一旦我改变了场景,它就会把我的游戏带过来,并且很好......继续。你仍然可以看到飞来飞去的敌人,这不是我想要的。我试过(我想象不好)这个问题,只是想知道如何删除这些函数,因为我添加的RemoveEventListener没有完成这项工作。为了澄清,我想知道如何删除所有childs / eventlisteners并结束我去下一个场景时的所有功能。 (这是我遇到困难的等级时间功能)谢谢:)

1 个答案:

答案 0 :(得分:1)

此代码中缺少很多内容。让我们分解你的所有功能,看看发生了什么以及为什么事情不起作用。

当你的计时器用完时,你试图删除两个听众:

removeEventListener(Event.ENTER_FRAME, addbEnemy);
removeEventListener(Event.ENTER_FRAME, onclick);

对于第一个,我无法弄清楚为什么这个功能甚至存在。它所做的就是在每个帧上一遍又一遍地向舞台添加相同的Benemy对象,位于完全相同的位置。你应该弄清楚为什么这个函数存在,如果它甚至是必要的。

至于第二个,onclick不接受ENTER_FRAME事件。它需要一个CLICK事件。因此,您需要将其更改为此内容才能删除点击事件:stage.removeEventListener(MouseEvent.CLICK, onclick);

很好,现在您无法再点击添加项目符号了。但其他一切呢?那么你还没有删除任何控制其他对象的侦听器。您可以先停止所有正在运行的计时器。

tm.stop();
myTimer.stop();
tm.removeEventListener(TimerEvent.TIMER, onstart);
myTimer.removeEventListener(TimerEvent.TIMER, levelTimer);

好的,现在计时器已停止,所以不会产生新的敌人,并且每60秒后船只不会爆炸。
接下来是什么?英雄仍在四处移动,因此请删除控制英雄的ENTER_FRAME事件:removeEventListener(Event.ENTER_FRAME, onenter);

最后一件事是屏幕上的所有敌人。

不幸的是,我甚至没有看到在您发布的代码中处理敌人移动的代码。我假设它们的移动是在enemy类中处理的,所以你需要在该类中添加一个停止函数,然后在每个敌人上调用它。

不幸的是,所有敌人都被添加到onstart()功能的本地范围内的舞台中,因此您无法访问它们。有两种方法可以解决这个问题:

  1. 对舞台上的所有儿童进行循环并检查每个儿童是否是敌人,如果是,请调用您创建的停止功能。
  2. onstart()函数中,将每个敌人添加到一个数组中以存储对它的访问。然后,在levelTimer()函数中,遍历每个数组元素并调用stop函数。