2013-11-10 67 views
0

我試了很多個小時,編碼和搜索解決方案,我的問題沒有效果。stage.removeChild(this)返回一個錯誤 - ActionScript 3.0

錯誤: TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。

簡報: 我正在創建一個遊戲,一直在隨機間隔等背景雲產卵器上工作,其中一個想法是讓雲在她的壽命達到0後消失(我們從100倒數到0)。項目採用30 FPS。有趣的是,導致錯誤的雲消失了(也許它仍然存在,但有0 alpha?),但接下來的雲,不會給出任何錯誤,一切正常。

所以,現在是時候了一些代碼和解釋:

Game類 - 文檔類

// VARIABLES 
    var clouds:Clouds = new Clouds(); 
    static var cloudsTimerDelay:Number = 3000; 
    static var cloudsTimer:Timer = new Timer(cloudsTimerDelay); 

// CONSTRUCTOR 
    cloudsTimer.addEventListener("timer", spawnCloud); 
    cloudsTimer.start(); 

// CALLED FUNCTION 
    function spawnCloud(e:Event){ 
     stage.addChildAt(new Clouds,1); 
    } 

雲CLASS

// VARIABLES 
    var fadeSpeed:Number = 0.05; 
    var lifeSpan:Number = 100; 

// CONSTRUCTOR 
    addEventListener("enterFrame", enterFrame); 

// CALLED FUNCTIONS 
    function enterFrame(e:Event) 
    { 
     this.lifeSpan--; 
     this.x += this.velocity; 

     if (this.lifeSpan < 0) 
     { 
      this.alpha -= this.fadeSpeed; 
      if (this.alpha <= 0) 
      { 
       kill(); // ERROR IN THIS FUNCTION 
      } 
     } 

    } 


    function kill() 
    { 
     removeEventListener("enterFrame", enterFrame); 
     stage.removeChild(this); // ERROR ERROR ERROR 
    } 

標誌着我只是上述錯誤的地方,這是stage.removeChild(this)導致的問題(這是什麼調試r說)。 這段代碼的主要思想是在舞臺上創建對象,設置時間間隔(計時器部分),當它創建時,對象開始的是它自己的enterFrame函數。它用於移動雲層,每幀從生命週期中減去1,當它達到0時,衰減開始於通過常量值改變alpha值,當alpha低於0時,kill函數應該進入,消除eventlistener和從舞臺上刪除雲。 任何想法爲什麼會發生此錯誤?我會非常感謝任何解決方案! 另外我非常抱歉,如果我寫的東西壞的方式,但這是我的第一個帖子在堆棧:)

乾杯!

+0

您在'var clouds:Clouds = new Clouds();'遊戲構造函數中創建一個「Clouds」實例。你用它做什麼? –

回答

0

好了,所以我在評論這個問題是在遊戲

var clouds:Clouds = new Clouds(); 

該變種是從來沒有在實際上添加到舞臺上說,但它仍然有充分的其他財產。所以當它的alpha值達到0時,它會調用它的kill()函數,該函數將要求DisplayObject.stage屬性爲null(因爲它從未被添加到舞臺中)。在錯誤中提及的您無法訪問的媒體資源是removeChild

請記住,當您在DisplayObject類中引用stage時,它將表示它自己的stage屬性。除非您將DisplayObject添加到舞臺,否則班級無法知道您正在使用的舞臺。這意味着this.stage有時可能是null

+0

刪除此行,一切正常,完全忘了它......這樣愚蠢的錯誤......謝謝! –

+0

沒問題!我無數次遇到了這個問題,我相信這實際上是人們在AS3中遇到的最常見的錯誤之一! –