« 1.4 表示リスト | メイン | 2.1 スクリプトの記述 »

1.5 rootとstage

■root
rootとは表示リストのツリー構造部分の一番上にある表示オブジェクトを示すプロパティです。通常、ステージに作ってあるインスタンスが追加されている表示リストの頂点の表示オブジェクトはメインのタイムラインです。
次の例ではステージにmushi_mcインスタンスとhanaChou_mcインスタンスがあります。hanaChou_mcインスタンスは入れ子構造になっていて、中にはchou_mcインスタンスが入っています。このとき、次のようにrootプロパティを調べるといずれも[object MainTimeline]と値が返ってきます。すなわち、いずれのrootもメインのタイムラインであることがわかります。

fig01-05-01 hanaChou_mcインスタンスは入れ子構造になっていて、中にはchou_mcインスタンスが入っています。

[:sample:] root-1.fla
例:インスタンスのrootプロパティの値を調べる
trace(mushi_mc.root);//出力: [object MainTimeline]
trace(hanaChou_mc.root);//出力: [object MainTimeline]
trace(hanaChou_mc.chou_mc.root);//出力: [object MainTimeline]

このようにインスタンスのrootはメインのタイムラインであることがわかりますが、rootの参照を利用する場合には注意が必要です。メインのタイムラインに定義してあるメソッドを実行したいときや変数を利用したいとき、次のようにrootの値をそのまま参照して使うと「未定義の可能性があるメソッドを実行した」といったエラーになります。

[:sample:] root-2.fla
例:rootのメソッドを実行する(エラーになる)
function test():void {
	trace("test OK");
}
mushi_mc.root.test();//エラーになる

エラーにならないようにするには、次のようにrootプロパティの値をいったんMovieClipタイプのオブジェクトに変換します。

[:sample:] root-3.fla
例:rootのメソッドを実行する(rootの参照をMovieClipタイプにする)
var rootObj:MovieClip = mushi_mc.root as MovieClip;
rootObj.test();//出力:test OK

[:note:] Objectタイプに変換してもうまくいきます。

■rootがメインのタイムラインにはならないケース
rootがメインのタイムラインにはならない場合とそのときのrootの値は次のとおりです。

1.表示オブジェクトがStageに直接追加されている。→ Stageオブジェクト
2.SWFを読み込んでいる。→ 読み込んだSWFのメインのタイムライン
3.読み込んだ外部イメージ(content.root)。→ Bitmapオブジェクト
4.ドキュメントクラスを指定している。→ ドキュメントクラス
5.表示リストに追加されていない表示オブジェクト。→ null

[:note:] AS3.0では読み込んだSWFのrootがずれないことから、AS2.0の_lockrootプロパティは不要になりました。

■stage
rootが表示オブジェクトが追加されているコンテナを指すプロパティであるのに対し、stageは最上位の表示オブジェクトコンテナであるStageを指すプロパティです。メインのタイムラインはstageに最初から追加されている表示オブジェクトコンテナです。次に示すようにstageには表示オブジェクトやコンテナを直接追加することもできます。このようなケースではrootの値はStageになります。

[:sample:] stage-1.fla
例:stageとメインのタイムラインにスプライトを追加する

//四角形を作る
var box:Sprite = new Sprite();
box.graphics.beginFill(0x00CCFF);
box.graphics.drawRect(60,100,100,100);
box.graphics.endFill();
//stageに直接追加する
stage.addChild(box);
//表示オブジェクトのrootを調べる
trace(box.root);
//出力:[object Stage]

Stageクラスのプロパティやメソッドはインスタンスメンバーであり、Stage.メンバーの式ではアクセスすることができません。StageクラスのインスタンスメンバーにアクセスするにはDisplayObjectクラスすなわち表示オブジェクトのstageプロパティを介してアクセスするという特殊な手法をとります。Flashのステージは1つなので参照するステージは同じものです。

例:現在のインスタンスのステージ幅
trace(stage.stageWidth);

これを省略せずに書くならば表示オブジェクト.stageの式でステージを参照します。

例:現在のインスタンスのステージの幅
trace(this.stage.stageWidth);

ムービークリップインスタンスのstageプロパティも同じステージを参照しています。

例:インスタンスmy_mcのstageプロパティ
trace(my_mc.stage);

About

2007年4月22日 12:52に投稿されたエントリーのページです。

ひとつ前の投稿は「1.4 表示リスト」です。

次の投稿は「2.1 スクリプトの記述」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。