トップページ > Stage > stageを参照できるタイミングについて



概要

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

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|