事件监听器取消注册自己?

时间:2009-08-16 08:32:30

标签: flash actionscript-3 event-handling

我有一个小精灵,是闪光动画中导弹背后的“烟雾痕迹”。我创建了一个自包含的类来处理它自己的创建和删除:

public class Spark extends Sprite {
    private var lifetime:Number = 15;
    private var gfxRef:MovieClip = new fx_particleTrail();
    private var canvas:Sprite;

    public function Spark(x:Number, y:Number, to:Sprite) {
        gfxRef.x = x;
        gfxRef.y = y;
        canvas = to;
        canvas.addChild(gfxRef);
        addEventListener(Event.ENTER_FRAME, tick);
    }

    private function tick(e:Event):void {
        lifetime --;
        gfxRef.alpha -= 0.05;
        if (lifetime <= 0) {
            gfxRef.alpha = 0;
            removeEventListener(Event.ENTER_FRAME, tick);
            canvas.removeChild(gfxRef);
            gfxRef = null;
        }
    }
}

这一切似乎都运行良好 - 我无法追踪此例程中的任何错误。然而,有时火花会永远粘在屏幕上 - 终身计数器会停在一定数量但永远不会进展。就好像EventListener决定放弃幽灵一样。

我很确定它不是初始化,因为它们会在Alpha-tude的各种状态下失败,表明在某些时候存在质量故障。

我想也许一下子产生这么多是一个问题,但我操纵它来生成一个 - 我扔了一些痕迹:

  > Born
  > 15
  > 14
  > 13
  > 12

它结束了。放置了事件监听器,它因某种原因停止了!s

这适用于AS3 / Notepad中的FlexSDK(不使用Flash开发环境)。

帮助!

2 个答案:

答案 0 :(得分:1)

您的代码没有任何问题。我强烈怀疑问题不在你发布的代码中,而是在其他地方。如果我拿出你的确切代码并运行它(同时注释掉与gfx相关的东西),它会按预期计数到0。

什么是管理Spark(或火花的集合)?您确定每个Spark实例的生命周期足够长吗?

最后,您的一般方法效率不高。让每个Spark都有自己的事件监听器并不是绝对必要的,您应该考虑一个具有单个更新循环并管理所有Spark的类。看看像flint particles这样的现有粒子系统。

答案 1 :(得分:0)

可能导致这种情况的一件事是在构造函数外部实例化gfxRef。我确信,如果对数组执行此操作,它将变为静态变量,由所有对象共享。尝试在构造函数中实例化它。

你还不需要gfxRef,你可以使用该类,因为它扩展了Sprite。删除gfxRef,并将对它的所有引用更改为 this 。然后将其附加到您在闪光灯中制作的影片剪辑中,并在该动画片段中绘制烟雾云。