概要
object.stage
DisplayObjectを継承したクラスのオブジェクト、つまり表示できるオブジェクトからstageを参照することが出来ますが、このオブジェクトがstageと繋がっていないとnullが返却されます。
stageの参照
trace(object.stage); // null
addChild(object);
trace(object.stage); // [object Stage]
"繋がる"というのはaddChild()によって、オブジェクトがstageの子(孫)になっていればという意味です。
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main()
{
var object:Sprite = new Sprite();
trace(object.stage); // null
addChild(object);
trace(object.stage); // [object Stage]
}
}
}
- addChild()する前にstageを参照。
- stageと繋がっていないのでnullが返却される
- addChild()した後にstageを参照。
- stage→Main→objectと繋がっているのでstageオブジェクトが取得できる
初期化時のstage参照
class MyClass extends Sprite
{
public function MyClass()
{
trace(stage); // null
}
}
addChild(new MyClass());
addChild()で繋がるよりコンストラクタ初期化の方が先に実行されるので、上の書き方だとstageを参照することが出来ません。
方法1
class MyClass extends Sprite
{
public function MyClass(stage:Stage)
{
trace(stage); // [object Stage]
}
}
addChild(new MyClass(stage));
オブジェクト生成元からコンストラクタにstageを渡す方法です。
方法2
class MyClass extends Sprite
{
public function MyClass()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); // もう監視する必要がないので削除
trace(stage); // [object Stage]
}
}
addChild(new MyClass());
Event.ADDED_TO_STAGEイベントを登録しておくと、stageと繋がる、つまりstageが参照できるようになったときに対応するメソッドを呼んでくれます。
方法3
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public static var instance:Main;
public function Main()
{
instance = this;
addChild(new MyClass());
}
}
}
import flash.display.Sprite;
class MyClass extends Sprite
{
public function MyClass()
{
trace(Main.instance.stage);
}
}
ドキュメントクラスのインスタンスをstatic(シングルトン)で参照出来るようにしておき、そこからstageを取るという方法もあります。
(ちょっと微妙かも)
(ちょっと微妙かも)
検証用コード
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main()
{
addChild(new MyClass());
}
}
}
import flash.display.Sprite;
import flash.events.Event;
class MyClass extends Sprite
{
public function MyClass()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
trace(stage);
}
}
このwikiの更新情報RSS