在AS3中删除MovieClip

时间:2011-07-20 19:18:32

标签: flash actionscript-3 actionscript

所以我昨晚创造了一个有趣的小项目,涉及创建很多小圆圈(明星)。所以为了代表这个明星,我创造了一个星级。这是最相关的方法

public class Star extends MovieClip
{

public function Star(r:Number)
        {
            starRadius = r;
            this.animated = false;
            this.graphics.beginFill(0xFFFFFF);
            this.graphics.drawCircle(0,0,starRadius);
            this.graphics.endFill();

            this.addEventListener(Event.REMOVED, onRemoval);
        }
public function animate():void
        {
            if( isNull(angle)|| isNull(speed)){
                throw new Error("Angle or speed is NaN. Failed to animate");
            }
            if(animated){
                throw new Error("Star already animated");
            }
            if(this.parent == null){
                throw new Error("Star has not been added to stage yet");
            }

            this.addEventListener(Event.ENTER_FRAME, doAnimate, false, 0);
            animated = true;
        }

private function doAnimate(e:Event):void{

            if(isNull(cachedDirectionalSpeedX) || isNull(cachedDirectionalSpeedY)){
                cachedDirectionalSpeedY = -speed * Math.sin(angle); 
                cachedDirectionalSpeedX = speed * Math.cos(angle);
            }

            this.x += cachedDirectionalSpeedX;
            this.y += cachedDirectionalSpeedY;


            if(this.x > this.parent.stage.stageWidth || this.y > this.parent.stage.stageHeight){
                this.dispatchEvent(new Event("RemoveStar",true));
                this.removeEventListener(Event.ENTER_FRAME, doAnimate);

            }


        }

为了总结它的作用,基本上在初始化时它会为自己添加一个监听器,它基本上只是为每个实例的变量赋值。当调用animate()时,它会向自身添加一个侦听器,该侦听器会向某个方向激活。此侦听器还会检查其位置是否已经位于舞台之外,并在已经存在时停止其移动。另外,它会调度一个事件,以便父母知道何时删除它。

所以在“主要”课程中,我有

this.addEventListener("RemoveStar", removeStar);

private function removeStar(e:Event):void
        {
            starCount--;
            this.removeChild(Star(e.target));
        }

我有另一个听众,它基本上打印出每次都有的孩子数,但我不会把代码放在这里。我遇到的问题是......看起来移除星星的听众不会“一直”工作。当在启动期间创建1000颗星而没有其他任何东西时,孩子的数量在一开始就下降并且卡在一定数量上,这使我认为有些电影片段没有被删除。有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:0)

检查是否要移除所有事件侦听器,例如removeStar ...我没有看到如何将removeStar侦听器附加到“Main”,但是remove star函数正确地将e.target属性引用为星号。 ..

基本上,你需要“杀死”对象的所有引用,以便将来在GC通过的时候“释放”它。

虽然你没有“删除”所有星星的原因可能是你的“删除检查”代码中只检查了右边和底边...可能有些星星向左或向上移动...为左边添加附加条件并且它可以修复自己...(this.x< 0 || this.y< 0)