2009-08-22 6 views
1

私は、次の2つのクラスがあります。AS3 - ルートクラス以外のステージを使用できないのはなぜですか?

はTypeError:エラー#1009:nullのオブジェクトのプロパティやメソッドにアクセスすることはできません、私は次のエラーを取得する

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); 
     } 

    } 

} 

を参照。 [C:\ Documents and Settings \ Roma \ poo \ src \ NewClass.as:10] Main/init()[C:\ DocumentsとSettings \ Roma \ poo \ src \ Main.asにある のNewClass() 23] at Main()[C:\ Documents and Settings \ Roma \ poo \ src \ Main.as:15]

なぜですか?

+0

回答更新... greetz – back2dos

答えて

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 
     } 
    } 
} 

とメイン::次のようにINIT::クラス次のように

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

ああ、あなたはちょうどあなたが傾いている場合には、Tools > Program Settings > FlashDevelop > IndentingBraceOnLineBraceAfterLineからあなたCoding Style Typeを変更することができます...;)


編集: あなたが舞台にアクセスしたい場合は、内DisplayObjectのスコープでは、ステージが利用可能であることを確認する必要があります...できるだけ早くステージにアクセスしたい場合は、トリックが必要です。ただし、クリックハンドラーの場合、これはDisplayObjectが表示リストにあることを自動的に示します。それ以外の場合はクリックできませんでした...

少しメモ:私は、どこからでもステージにアクセスすることは特に賢明だと思う...表示するには、アプリケーションの階層が表示リストの階層に従うべきである、すなわちアクセスがルートから支店ではなく、他の方法ラウンド...これは...正しく言う


greetz

back2dos back2dosとして

+0

これは、ライブラリをインポートするとif(stage)を追加する必要があります。 ..行を使用するすべてのクラスにコードの行? – RValentine

+1

インポートしようとしているライブラリが「ステージ」を参照している場合は、ステージにステージが追加されていないと機能しない可能性があります。それを編集するのではなく、それが必要なときにステージに追加されているかどうかを確認することです。 – fenomas

+0

私はちょうど同じ問題を抱えていましたが、これで解決しました。ありがとうございます。 – Boundless

0

、表示リスト上にある要素だけ再利用性を達成することが重要ですステージへの有効な参照があります。 NewClassのインスタンスはMainインスタンスのinitメソッドの一時変数に過ぎず、表示リストに入れるにはまだaddChildになっていますので、値はstageです。注:ディスプレイリストにもある親の子供だけがステージへの有効な参照を取得します。

表示リストに追加されないクラスのステージへの参照が必要な場合は、ステージをそのクラスのインスタンスに渡す必要があります。AS2とは異なり、ステージへのグローバルにアクセス可能なリファレンスはありません(つまり、_root_level0は推奨されていません)

関連する問題