0

我创建了一个新形状,创建了一个侦听器,当对象碰到形状时启动一个函数,该函数清除形状的图形,删除侦听器并删除子对象。但看起来它会留下一些幽灵,当我的对象到达它的位置时仍然会触发。我不确定它为什么会发生,我认为 clear+remove 应该使它不可能 hitTest。但是不知何故,孩子们仍然相互堆积,最后一个创建的孩子触发了该功能。因此,如果您理解,请给我一个提示,如果不明白,请笼统地告诉我什么是永久删除创建的形状的方法,所以它不算存在?

一点细节。击中形状必须启动一个删除它的函数并创建一个具有相同功能的不同功能的同名新形状等。因此当前函数必须是我调用的那个,而不是最后一个,我的监听器删除。每次制作新形状可能会使记忆超负荷,而且我每次都会清理。我忘了什么吗?

fun0(){
  var bob:Shape = new Shape();
  addChild(bob);
  bob...drawRect...
  addEventListener(...,fun1)
  function fun1(){ if(hitTest...){
  bob...clear();
  removeChild(bob);
  removeEventListener(...,fun1)
  fun2();
  } 
 }


fun2(){
  var bob:Shape = new Shape();
  addChild(bob);
  bob...drawRect...
  addEventListener(...,fun3)
  function fun1(){ if(hitTest...){
  bob...clear();
  removeChild(bob);
  removeEventListener(...,fun3)
  fun0();
  } 
}

等等,即使我删除了监听器,它也只会在我触发它后才看到 fun3。同样,我确实将对象移开,它不再 hitTest,然后清除 + 删除。如果您不明白或无法提供帮助,请不要生气,忽略这一点,我需要帮助,而不是我没有你聪明的信息。谢谢你。

4

1 回答 1

0

首先不要在函数内部声明函数。然后对事件监听器使用弱引用。

// params: eventName, listener, capturePhase, priority, useWeakReference
someObj.addEventListener("eventName",myFunct,false,0,true);

您必须摆脱对该对象的任何引用,然后将其设置为 null

removeChild(bob); 
bob= null;

之后GC会收集它!

编辑:

如果您继续进行 hitTest,例如在 enterFrame 上。通过检查对象的 .stage 属性来检查对象是否在舞台上。

if(bob.stage)
  {
    if(hitTest ...){};
  }
于 2013-03-03T13:42:06.100 回答