AS3から変わったステージへのアクセス。AS2ではStageオブジェクトとしてどこからでもアクセスできましたが、AS3ではちょっとめんどくさい。軽くはまったのでメモ。

AS3でSpriteクラスを継承したカスタムクラスを作る場合などに、作成したカスタムクラスを表示オブジェクトのツリーに追加しないとstageプロパティはnullを返します。

表示オブジェクトが表示リストに追加されていない場合、stage プロパティは null に設定されます。

例えば、ステージのサイズとかが欲しいときは

1
2
3
4
//フレームアクション
var hoge = new HogeHoge();
addChild(hoge);
hoge.centering()

カスタムクラスをaddChild()してからcentering()メソッドを呼び出す

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package
{
    import flash.display.Sprite;

    public class HogeHoge extends Sprite
    {
        private var sp:Sprite;

        function HogeHoge()
        {
            sp = new Sprite();
            //コンストラクタの時点ではstageプロパティはnullを返すので
            //ステージのサイズは取得できない
        }
        public function centering():void
        {
            //stageはDisplayObjectContainerに追加されてはじめて
            //取得可能になる
            sp.x = (stage.stageWidth)/2;
            sp.y = (stage.stageHeight)/2;
        }
    }
}

stageなどがDisplayObjectのプロパティになったのは、DisplayObjectを継承して自分自身のstageプロパティにアクセスしろってことなんですね?多分。

それから、確かAS2もそうだったけどAS3でもあいかわらずステージの1フレーム目ではstageHeightプロパティの返す値がおかしい。