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

时间:2015-02-14 09:46:21

标签: arrays actionscript-3 class flash

我有一个Volcano类。它的目的是随机喷洒lavaMass。 在主要类中,我已经做到了这一点,当我的角色击中熔岩时,一切都被移除,并且调用了deleteLava()函数。

我的问题是,使用deleteLava()函数,我的Volcano类在几个'死亡'之后就停止了熔岩。

现在我解释起来有点复杂。 我发现在deleteLava()函数中我还应该从数组中删除lavaMass,因为无论有多少'死亡',它都会继续制作熔岩。 我使用'lavaSpray.shift();',并试过'拼接'.. 这有效!除了它不会删除所有的lavaMass,所以每次角色死亡时,一些lavaMass对象会在关卡中不停地移动,而不是移动。因此,在许多“死亡”之后,有很多lavaMass对象只是站着不动,没有移动而没有被删除。

这是火山类:

包{

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

2 个答案:

答案 0 :(得分:0)

我怀疑问题是:

删除熔岩时,您不会删除ENTER_FRAME事件监听器。

删除孩子并不意味着你删除了它的听众。 所以你可以移除所有的熔岩,但ENTER_FRAME仍会创造更多! 你必须把它自己移除。

所以你必须添加

removeEventListener(Event.ENTER_FRAME, makeLava)

作为您职能的第一行deleteLava()

.... 或者你可以添加

addEventListener(Event.REMOVED_FROM_STAGE, onRemoved)

并创建onRemoved(e:Event){}功能 然后在此函数内删除您添加的任何侦听器,包括ENTER_FRAME&amp; REMOVED_FROM_STAGE


尝试阅读有关这些主题的更多信息

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

我可能只是链接,但我更喜欢谷歌他们,并从不同的资源阅读 - 无论他们用什么语言解释 -

祝你好运

答案 1 :(得分:0)

只是为了澄清你的问题..你在volacano类中添加了lavamass?你需要移除lavamass或火山? Dp你在编译期间遇到任何错误?在开发射击游戏时我也遇到了类似这样的事情,删除掉了Bullerts后移除的子弹出现了。我做的是,我只是将子弹添加到空的动画片段中并删除整个剪辑。