代码之家  ›  专栏  ›  技术社区  ›  Andy Moore

事件监听器取消注册?

  •  0
  • Andy Moore  · 技术社区  · 17 年前

    我有一个小精灵,它是闪光动画中导弹后面的“烟迹”。我创建了一个独立的类来处理自身的创建和移除:

    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;
            }
        }
    }
    

    一切似乎都很好-我无法从这个程序中找出任何错误。然而,有时一个火花会永远停留在屏幕上-一生的计数器在某个数字上停止,永远不会前进。就好像事件监听器刚刚决定放弃幽灵。

    我很确定这不是初始化,因为它们在不同的alpha-tude状态下会失败,这表明在某个点或另一个点上存在质量故障。

    我认为一次生成这么多可能是个问题,但我操纵它生成了一个单一的问题——我还添加了一些痕迹:

      > Born
      > 15
      > 14
      > 13
      > 12
    

    就这样结束了。事件侦听器已放置,但由于某种原因它刚刚停止!S

    这与AS3/记事本中的flexsdk一起工作(不使用flash开发环境)。

    救命!

    2 回复  |  直到 17 年前
        1
  •  1
  •   James Fassett    17 年前

    你的代码没有什么问题。我强烈怀疑问题不在你发布的代码中,而是在其他地方。如果我使用您的确切代码并运行它(同时注释掉与gfx相关的内容),它将按预期倒计时到0。

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

    最后,您的一般方法不是很有效。使用自己的事件侦听器进行每个spark并不是绝对必要的,您应该考虑一个具有单个更新循环并管理所有spark的类。看看一些现有的粒子系统,比如 flint particles .

        2
  •  0
  •   Marius    17 年前

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

    无论如何,您并不真正需要gfxref,您可以使用类,因为它扩展了sprite。删除gfxref,并将其所有引用更改为 相反。然后把它贴到你在Flash中制作的电影剪辑上,在这个movie clip中画一个烟雾云。