2012-01-02 108 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

相關問題