2009-07-26 19 views
1

Costumクラスのステージクラスプロパティにアクセスするにはどうすればよいですか?カスタムクラスのActionScript 3.0 stageWidth

クラス:

package { 
    import Main; 
    import flash.events.*; 
    import flash.display.Sprite; 
    import flash.display.Stage; 

    public class Run extends Sprite { 
     var obj:a1_spr; 


     public function Run() { 
      runAssets(); 

     } 



     private function runAssets():void { 
      obj = new a1_spr() 
      addChild(obj); 
      obj.x = stage.stageWidth/2; 

     } 
    } 
} 

出力:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 

答えて

2
this.addEventListener(Event.ADDED_TO_STAGE, handleAdedToStage) 

private function handleAddedToStage(event:Event):void 
{ 
    this.runAssets() 
} 

private function runAssets():void 
{ 
    obj = new a1_spr(); 
    addChild(obj); 
    obj.x = this.stage.stageWidth/2; 
} 

あなたは、ステージにを注入しない限り、(コンストラクタでのステージへのアクセス権を持っているつもりされていませんクラス)。スプライトにはステージプロパティがあります。ジョエルが言ったことに展開して、コンテキストにそれを置くために

+0

タンク・ユー。できます。しかし、なぜ私が理解しているのか分からない。リスナーと一緒に走らなければならない理由を説明してください。 –

+0

すべてのDisplayObjectのstageプロパティは、表示リストに追加されるまではnullです。したがって、オブジェクトにアクセスする前にそのオブジェクトがオブジェクトに含まれていることを確認する必要があります; – Cay

+0

var myObjectを使用してオブジェクトをインスタンス化するとき:MyObject = new MyObject ()コンストラクタはすぐに実行され、コンストラクタの内部で呼び出すメソッドも含まれます。新しいMyObjectの次の行がaddChild(myObject)であっても、myObjectはステージ上にないか、ステージへの参照を持たないでしょう。また、ステージを作ることもできます:MyObjectのコンストラクタ引数をステージングします。新しいmyObject(this.stage)があり、アプリケーションのステージにすぐにアクセスできます。 –

3

すべての表示オブジェクトは、.stage性質を持っていますが、あなたが表示リストにオブジェクトを表示、追加されるまで、そのプロパティはnullです。したがって、後で追加されるため、アクセスすることはできません。

ステージにオブジェクトを追加すると、イベントADDED_TO_STAGEが発生し、.stageプロパティが設定されたことがわかります。その後、あなたはどこにいてもステージにアクセスできます。

あなたのことを明確にする希望。

0

フラッシュがflasアセットを.asファイルでコンパイルするとき、ステージはありません。コードはドキュメントクラスの準備として開始されるので、レンダリングできるようにステージがあるかどうか聞いてください。

だからこそ、ADDED_TO_STAGEを聞いて、実際に表示リストに入っているかどうかを確認します。

この問題は、実際のステージがあるときに表示リストに追加する必要があるため、すべての表示オブジェクトで発生します。

このリスナーを追加してステージを確認するために使用されます。特にチームで作業している場合や、大規模なプロジェクトで独自のコンポーネントを実行している場合

関連する問題