2011-04-04 57 views
0

我在同时删除事件侦听器以及精灵时遇到问题。目前,我得到一个错误:同时删除事件侦听器以及精灵AS3

TypeError: Error #1009: Cannot access a property or method of a null object reference.

如果我注释掉removeChild之,我没有错误,但是,很明显,精灵保留在屏幕上。任何想法如何摆脱我自己的错误?

 //Bullet extends Sprite Class 
    bullet:Bullet = new Bullet(); 
    mc.addChild(bullet); 
    bullet.addEventListener(Event.ENTER_FRAME, shoot); 

    function shoot(e:Event):void { 
     var shot:Bullet = e.currentTarget as Bullet; 
     //check shot is outside the frame 
     if (shot.x < 0 - shot.width || shot.x > stage.stageWidth || shot.y > 525) 
     { 
      //trying to remove the thing and it's listener 
      e.currentTarget.removeEventListener(e.type,arguments.callee); 
      e.currentTarget.parent.removeChild(shot); 
     } 
     else 
     { 
      shot.setInMotion(); 
     } 
    } 
+0

不要忘了把在shot.y < 0 - shot.height :) – 2011-04-04 21:47:02

+0

只是一点:通常当添加事件侦听器时,使用弱引用即addEventListener(Event,shoot,false,0,true),这允许组件被垃圾收集并且类似于删除eventListener – Ryan 2011-04-05 10:53:54

回答

0

除了子弹之前丢失VAR:子弹,我没有看到任何错误的示例代码。你应该后设置断点右:

var shot:Bullet = e.currentTarget as Bullet; 

,弄清为什么拍摄为空。作为例子,我怀疑在你提供的一小部分代码之外有一些代码存在缺陷。如果代码只处理removeChild行注释掉,它告诉我e.currentTarget不是null,但它也不是对Bullet类型实例的引用(即“as”cast将返回null)。

+0

你知道,你是对的 - 我忘了我在前面的条件陈述之外留下了一条痕迹。 – toast 2011-04-05 14:40:44

0

尝试扭转这些线路
也许参考e.currentTarget是越来越通过对象引用丢失

e.currentTarget.removeEventListener(e.type,arguments.callee); 
e.currentTarget.parent.removeChild(shot); 

e.currentTarget.parent.removeChild(shot); 
e.currentTarget.removeEventListener(e.type,arguments.callee);