AS3如何删除对象好?

时间:2013-03-03 08:48:37

标签: actionscript-3

我创建一个新的Shape,创建一个侦听器,当一个对象撞击形状时启动一个函数,该函数清除形状的图形,删除监听器并删除子。但看起来它会留下一些幽灵,当我的物体到达它的位置时它仍会触发。我不确定为什么会发生这种情况,我认为清除+删除应该让它无法命中。但不知何故,孩子们仍然堆叠在一起,最后创建的孩子会触发这个功能。所以,如果您理解,请给我一个提示,如果没有,请告诉我一般什么是删除已创建的Shape的方法,所以它不计算现有的?

一些细节。命中形状必须启动一个删除它的函数并创建一个具有相同名称的新形状,该函数具有相同的功能,因此当前函数必须是我所调用的函数,而不是最后一个,其监听者是删除。每次都有新形状可能会使内存过载,而且每次都会清理。我忘了什么吗?

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。再次,我确实移动了物体,它不再打击测试,然后清除+移除。如果你不理解或无法帮助,请不要火焰,只要忽略这一点,我需要帮助,而不是我不像你那样聪明的信息。谢谢。

1 个答案:

答案 0 :(得分: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 ...){};
  }