2009-08-22 20 views
1

我有以下兩類:AS3 - 爲什麼我不能在我的根類之外使用舞臺?

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
      var test:NewClass = new NewClass(); 
     } 

    } 

} 

package 
{ 
    import flash.display.Sprite; 

    public class NewClass extends Sprite 
    { 

     public function NewClass() 
     { 
      trace(stage.width); 
     } 

    } 

} 

我收到以下錯誤:

類型錯誤:錯誤#1009:無法訪問空對象的屬性或方法參考。 ()[C:\ Documents and Settings \ Roma \ poo \ src \ NewClass.as:10] at NewClass()[C:\ Documents and Settings \ Roma \ poo \ src \ Main.as: 23] at Main()[C:\ Documents and Settings \ Roma \ poo \ src \ Main.as:15]

爲什麼?

+0

答案更新... greetz – back2dos 2009-08-23 10:46:16

回答

8

是啊,一個閃光發展用戶...:d

嗯,原因是:階段僅適用對象,是顯示列表上...

修改類,如下所示:

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    public class NewClass extends Sprite { 
     public function NewClass():void { 
       if (stage) init(); 
       else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 
     private function init(e:Event = null):void {  
       removeEventListener(Event.ADDED_TO_STAGE, init); 
       trace(stage.width);//you may want to use stage.stageWidth actually 
     } 
    } 
} 

及主要::初始化如下:

private function init(e:Event = null):void {  
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      var test:NewClass = new NewClass();  
      this.addChild(test); 
    } 

哦,並且可以從BraceAfterLineTools > Program Settings > FlashDevelop > Indenting更改Coding Style TypeBraceOnLine,以防萬一你傾向於...;)


編輯: 如果您要訪問的階段,內你需要確定舞臺是可用的......如果你想盡快進入舞臺,那麼你需要提供的技巧......但是如果你訪問舞臺內的舞臺點擊處理程序,例如,這自動暗示DisplayObject在顯示列表中...否則它不能被點擊...

雖然有一點點注意:我不認爲,從任何地方訪問舞臺都是非常聰明的......當涉及到顯示時,您的應用層次結構應該遵循顯示列表層次結構,即,訪問從根節點到分支,而不是倒過來......這是實現可重用性重要...


格爾茨

back2dos

+0

那麼這是否意味着如果我導入一個庫,我將需要添加if(階段)。 ..代碼行到每個階段使用階段? – RValentine 2009-08-22 22:34:54

+1

如果您要導入的庫引用「stage」,那麼它可能不會運行,除非它已被添加到舞臺中。而不是編輯它,解決方案可能是確保它在需要時被添加到舞臺上。 – fenomas 2009-08-25 06:47:40

+0

我剛剛有同樣的問題,並解決了這個問題,謝謝。 – Boundless 2011-12-03 22:07:18

0

由於back2dos正確地說,只有那些顯示列表上的元素有一個有效的參考舞臺。由於NewClass的實例僅僅是Main實例的init方法中的一個臨時變量,而您尚未將addChild放置在顯示列表中,因此它的值stage屬性將爲空。注意:只有在顯示列表中的父母的孩子才能獲得舞臺的有效參考。

如果您需要對不會添加到顯示列表中的階段的引用,那麼您需要將該階段傳遞到該類的實例中。與AS2不同,沒有全局可訪問的階段參考(即_root_level0已棄用)

相關問題