2012-01-02 89 views
1

我正在制作游戏,如果敌人的子弹击中用户,子弹消失。一切工作正常,除非我继续收到'错误#1009:一旦子弹击中用户(子弹消失,但不能访问空对象引用的属性或方法)“。它让我感到困惑,因为我已经在另一个类中使用了几乎完全相同的代码,并且它完美地工作。AS3 - 错误#1009:无法访问空对象引用的属性或方法

package classes.enemy 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.display.Stage; 
import classes.Main; 

public class Bullet extends MovieClip 
{ 
    var speed:Number; 

    public function initialize() 
    { 
     var stageReff:Stage = this.stage as Stage; 
     stage.addEventListener("enterFrame", enterFrame); 
    } 

    //code 

    function enterFrame(e:Event):void 
    { 
     this.x += speed; 

     if(this.hitTestObject(Main.user)) 
     { 
      removeEventListener("enterFrame", enterFrame); 
      this.parent.removeChild(this); 
      // line above gives the error. 
     } 
    } 
} 
} 

我不知道什么可能是错的。 在此先感谢。

+0

在调试模式下运行,找到引发错误的行。它可能在'this.parent.removeChild(this)',但我可能是错的。如果是这样的话,那么'this'不再是父母的孩子。 – ToddBFisher 2012-01-02 21:54:13

+0

这是行:this.parent.removeChild(this);.如果我将它注释掉,它可以正常工作(但是子弹不会消失)。 – 2012-01-02 21:58:06

回答

2

我的猜测是它与你添加一个输入帧事件监听器到舞台的事实有关,但是试图从监听对象本身中移除它。

尝试改变

var stageReff:Stage = this.stage as Stage; 
stage.addEventListener("enterFrame", enterFrame); 

addEventListener("enterFrame", enterFrame); 
+0

这确实有用,谢谢!只需要删除'舞台'。感谢好友 – 2012-01-02 22:03:33

+0

!这实际上也帮助了我。 我用'this.parent'给了我错误,所以我尝试了'parent',它工作! – mim 2014-02-07 09:40:41

0

你不删除从舞台事件侦听器,但对象本身:)

我不建议这样做它像这样,在游戏主类中创建一个监听器,并调用更新功能所有的物体!

+0

我会试试,但那是我的问题:为什么它在这里失败,在另一个班级取得成功? – 2012-01-02 21:53:51

+0

你的观察是正确的,但我不认为这会导致一个空指针错误。 – RIAstar 2012-01-02 21:54:02

+0

@RIAstar这是因为enterFrame函数被调用的下一帧,它可能仍然会击中Main.user,所以它试图从它的父对象中删除它,但它已经做到了,所以引用为空! (哦,isee rvmook也解释了这个) – RasmusWL 2012-01-04 16:21:37

0

失败的原因是因为您移除子弹从它的父的原因。所以当你参考this.parent时,它会返回null,因为那里根本就没有父母了。您正尝试删除ENTER_FRAME事件,但因为您将其设置在舞台上,原始ENTER_FRAME事件将继续运行。你可以简单地修复它,像这样:

if(this.x > 30) 
{ 
    stage.removeEventListener("enterFrame", enterFrame); 
    this.parent.removeChild(this); 
} 

但像@RasmusWriedtLarsen已经指出的那样,这是更好地在全球多个处理这些事件。并让父母处理删除Bullet

相关问题