所以我昨晚创造了一个有趣的小项目,涉及创建很多小圆圈(明星)。所以为了代表这个明星,我创造了一个星级。这是最相关的方法
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颗星而没有其他任何东西时,孩子的数量在一开始就下降并且卡在一定数量上,这使我认为有些电影片段没有被删除。有谁知道这里发生了什么?
答案 0 :(得分:0)
检查是否要移除所有事件侦听器,例如removeStar ...我没有看到如何将removeStar侦听器附加到“Main”,但是remove star函数正确地将e.target属性引用为星号。 ..
基本上,你需要“杀死”对象的所有引用,以便将来在GC通过的时候“释放”它。
虽然你没有“删除”所有星星的原因可能是你的“删除检查”代码中只检查了右边和底边...可能有些星星向左或向上移动...为左边添加附加条件并且它可以修复自己...(this.x< 0 || this.y< 0)