2013-03-12 113 views
1

我想在完成動畫時刪除並重新添加/「重新啓動」Main類。我所有的動畫都發生在Main中,並被添加到Main中的顯示樹中。 Program.as通過添加/刪除Main來處理所有這些。我如何在Main.as中運行finishNow()函數?它一切正常,除了引發錯誤program.finishNow();

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

如何重新啓動AS類動畫

的FLA文件:

掛Program.as。

的Program.as文件:

package { 

    import flash.display.MovieClip; 

    public class Program extends MovieClip { 


     public function Program() { 

      startNow(); 
     } 

     function startNow() { 
      var run:Main = new Main(this); 
      addChild(run); 
     } 

     function finishNow() { 
      removeChild(run); 
      var run:Main = new Main(this); 
      addChild(run); 
     } 

    } 

} 

的Main.as文件:

package { 

    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 

     var stageHolder:Object; 
     public var program:Program; 

     public function Main(stageHolderTemp) { 
      stageHolder = stageHolderTemp; 
      trace(stageHolder); 

      someFunctionsThatDrawGraphics(); 
     } 

     function callFinishFunction():void { 
      // how to call finishNow() function from Program.as file here? 
      program.finishNow(); 
     } 

    } 
} 

回答

0

修復TypeError: Error #1009: Cannot access a property or method of a null object reference.可以在下面找到。此前該類指向一個空對象。

package { 

    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 

     // var stageHolder:Object; <- REMOVE this line 
     public var program:Program; 

     public function Main(stageHolderTemp) { 
      program = stageHolderTemp; // changed stageHolder to program 
      trace(program); // changed stageHolder to program 

      someFunctionsThatDrawGraphics(); 
     } 

     function callFinishFunction():void { 
      program.finishNow(); 
     } 

    } 
} 
2

你應該把你run可變類範圍的,不能正常範圍內。

package { 
    import flash.display.MovieClip; 
    public class Program extends MovieClip { 
    var run:Main; // <- THIS line 
     public function Program() { 
      startNow(); 
     } 
     function startNow() { 
      run = new Main(this); // and no 'var' here 
      addChild(run); 
     } 
     function finishNow() { 
      removeChild(run); 
      run = new Main(this); // also no 'var' here 
      addChild(run); 
     } 
    } 
} 
+0

即使它是全球性的(我複製並粘貼了你的代碼),它仍然顯示出同樣的錯誤? – ArrayOutOfBounds 2013-03-12 16:16:13

+0

@ArrayOutOfBounds,Vesper的答案正在糾正至少一個問題。在原始代碼中,'finishNow()'方法中的'run'變量應該爲空。該方法如此之短,很難看出爲什麼「空對象引用」錯誤仍然會發生,但對於該方法的其他兩行沒有意義:)我建議您安裝調試Flash Player,錯誤消息會爲您提供問題發生位置的行/幀編號,然後您可以確切確認問題所在。 – 2013-03-12 16:31:26

+0

@ArrayOutOfBounds哦,我認爲Vesper和我可能誤解了你對錯誤發生地點的評論。就像我說的,他指出了另一個問題。但是在它到達那裏之前,這個錯誤會在'Main.as'裏面的'callFinishFunction()'方法中拋出。那裏也出現了同樣的問題。 'Main.as'有一個'program'變量,但它永遠不會被設置並且爲空。程序變量和'stageHolder'變量是多餘的。爲了修復,保留Vesper的修復,然後刪除'stageHolder'並在'Main.as'的構造函數中執行'program = stageHolderTemp'。 – 2013-03-12 16:37:41