无法使删除功能正常工作 AS3

can't get delete function to work properly AS3

我有一座火山class。它的目的是随机喷射 lavaMass。 在主要部分 class 我已经做到了,当我的角色撞到熔岩时,一切都被移除,并调用 deleteLava() 函数。

我的问题是,使用 deleteLava() 函数后,我的火山 class 在 'deaths' 后停止生成熔岩。

现在我解释起来有点复杂。 我发现在 deleteLava() 函数中,我还应该从数组中删除 lavaMass,因为无论有多少 'deaths',它都会继续生成熔岩。 我用了 'lavaSpray.shift();',并尝试了 'splice'.. 这奏效了!除了它不会删除所有的 lavaMass 之外,所以每次角色死亡时,一些 lavaMass 对象都会在关卡中徘徊,不会移动。所以在许多 'deaths' 之后,有很多 lavaMass 对象只是静止不动,没有移动也没有被删除。

这里是火山 class:

套餐{

import flash.display.MovieClip;
import flash.events.Event;

public class Volcano extends MovieClip {

    var lavaSpray:Array = [];
    var lavaNum:Number;
    var world:World;

    public function LavaThing() {
        addEventListener(Event.ENTER_FRAME, makeLava)
    }

    public function deleteLava()
    {
        this.parent.removeChild(this)
        for (var m = 0; m < lavaSpray.length; m++) {
        if (lavaSpray[m].parent) { 
        lavaSpray[m].parent.removeChild(lavaSpray[m]); 
            }
        }
    }

    function makeLava (e:Event)
    {
        lavaNum = Math.random()*70
        if (lavaSpray.length<20)
            {
            if (lavaNum > 68.15)
                {
                    var lavaMass = new LavaMass();
                    lavaSpray.push(lavaMass);
                    addChild(lavaMass);
                    lavaMass.scaleY = 0.5;
                    lavaMass.scaleX = 0.5;
                    lavaMass.x += 90;
                    lavaMass.y += Math.random()*30
                    lavaMass.y -= Math.random()*30
                }
            }

        for each (lavaMass in lavaSpray)
            {
                lavaMass.x += 4;
                if (lavaMass.parent &&  lavaMass.x > 800)
            {
            lavaMass.parent.removeChild(lavaMass);
            lavaSpray.shift();
            }
        }
    }
}

}

我希望有人知道我在说什么。提前致谢。

我发布了一个视频来解决我的问题: https://www.youtube.com/watch?v=rYxYHB7rcgY&feature=youtu.be

我怀疑问题是:

删除熔岩时不会删除 ENTER_FRAME 事件侦听器。

删除子项并不意味着您删除了它的侦听器。 所以你可以移除所有熔岩,但 ENTER_FRAME 仍然会产生更多熔岩! 你必须自己删除它。

所以你必须添加

removeEventListener(Event.ENTER_FRAME, makeLava)

作为函数的第一行 deleteLava()

..... 或者您可以添加

addEventListener(Event.REMOVED_FROM_STAGE, onRemoved)

并创建 onRemoved(e:Event){} 函数 然后在此函数中删除您添加的任何侦听器,包括 ENTER_FRAMEREMOVED_FROM_STAGE


尝试阅读更多关于这些主题的内容

游戏循环 实体系统框架 池对象模式

我可能没有链接,但我更喜欢你 Google 它们,并从不同的资源中阅读 - 无论它们是用什么语言解释的 -

祝你好运

只是为了澄清您的问题。您在火山中添加了熔岩 class?你需要移除熔岩或火山? Dp 你在编译过程中有什么错误吗?我在开发射击游戏时也遇到过这样的事情,移除子弹后会出现移除的子弹。我所做的是,我只是将项目符号添加到一个空的影片剪辑中,然后删除了整个剪辑。