【问题标题】:AS3- Removing childs from stage when changing scene through a functionAS3-通过功能改变场景时从舞台上移除孩子
【发布时间】:2015-03-16 00:53:21
【问题描述】:

我目前正在创建一个游戏,其中玩家控制一艘发射敌舰的宇宙飞船。我在场景中添加了一个计时器,这样 60 秒后“母船”的电影剪辑就会爆炸并消失。然而,当这种情况发生时,我想移动到一个不同的场景作为“关卡完成”场景,但是一旦我改变场景,它就会随身携带游戏并且有点好……继续。你仍然可以看到敌人飞来飞去,这不是我想要的。我已经尝试过(我想象的很糟糕)这个问题,只是想知道如何从运行中删除这些函数,因为我添加的 RemoveEventListener 没有完成这项工作。为了澄清,我想知道如何删除所有孩子/事件监听器并在我进入下一个场景时结束所有功能。 (这是我遇到困难的 leveltimer 功能)谢谢 :)

【问题讨论】:

    标签: function actionscript-3 timer removechild scene


    【解决方案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() 函数中,循环遍历每个数组元素并调用停止函数。

    【讨论】:

    • @NicholasAndrewThompson 我同意,数组是更好的方法。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2013-10-11
    • 1970-01-01
    • 2012-02-18
    • 2011-03-26
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多