DisplayObjectContainer クラスについて
・ | ディスプレイオブジェクトコンテナとは? |
・ | 表示オブジェクトを表示リストに登録する |
・ | 表示オブジェクトを表示リストから除外する |
・ | 表示オブジェクトの表示優先度(奥行き)を変更する |
・ | 表示リストから表示オブジェクトを取得する |
ディスプレイオブジェクトコンテナとは?
■ DisplayObjectContainer とは?
■表示オブジェクトは、親子関係の構築が可能
スプライトやムービークリップなどの表示オブジェクトは、別の表示オブジェクトを入れ子にする事ができます。
■親子関係を構築すると?
親子関係を構築すると、親の位置、角度、スケール、カラー、ブレンド、ファイルタなどの設定が、子孫にも継承されるようになります。
■親になれる表示オブジェクトについて
親になれるのは、DisplayObjectContainer クラスを継承している表示オブジェクトです。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html
例えば、以下の種類があります。(一部抜粋)
■子になれる表示オブジェクトについて
子になれるのは、DisplayObject クラスを継承している表示オブジェクトです。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html
例えば、以下の種類があります。(一部抜粋)
■ DisplayObjectContainer クラスの機能
DisplayObjectContainer クラスは、子を管理するための機能がまとまっています。
■ DisplayObjectContainer クラスの派生について
DisplayObjectContainer クラスは、以下の様に派生しています。
ここで解説してない分は、リンク先に解説がありますので合わせてご覧下さい。
Object |
↓派生 |
EventDispatcher |
↓派生 |
DisplayObject |
↓派生 |
InteractiveObject |
↓派生 |
DisplayObjectContainer |
■表示リストについて
DisplayObjectContainer クラスには、『表示リスト』と呼ばれる、子を保持するためのリストがあります。
『表示リスト』に、任意の表示オブジェクトを登録すると、子として扱われるようになります。
『表示リスト』には、複数の表示オブジェクトを登録することが可能です。
『表示リスト』に登録した表示オブジェクトは、Flash 画面上に表示されるようになります。
『表示リスト』の登録順序を入れ替えると、表示オブジェクトの表示優先度(奥行き)を変更することができます。
■Stage について
■Stage とは?
Stage は、Flash の画面上で、最も上の階層(ルート)となります。
Stage クラスの表示リスト以外の機能については、こちらで解説しています。
■Stage を基とした木構造を構築する
Stage の『表示リスト』に、表示オブジェクトが登録されているとします。
その表示オブジェクトの『表示リスト』に、さらに別の表示オブジェクトを登録することができます。
登録を繰り返していくと、下のような Stage を基とした木構造を構築することができます。
■任意の表示オブジェクトを Flash 画面上に表示するには?
Stage の『表示リスト』に、任意の表示オブジェクトを登録すると、その表示オブジェクトは Flash 画面上に表示されるようになります。
任意の表示オブジェクトが、Stage からの『表示リスト』の連結で繋がっていれば、その表示オブジェクトは Flash 画面上に表示されます。
Stage までの『表示リスト』の連結が途切れていれば、その表示オブジェクトは Flash 画面上に表示されません。
■Stage の表示リストに登録した場合の注意点
Stage から、画面全体を制御する事はできません。
画面全体を制御したい場合、次に解説する、Document の表示リストに登録します。
■ Document について
■Document とは?
Document は、表示オブジェクトの一種です。
初期状態では、Stage の表示リストの 0 番目に登録されています。
"root1" というインスタンス名が付けられています。
■ Adobe Flash の場合
Adobe Flash において、Document は、最上位のタイムラインに相当します。
デフォルトの状態で出力した場合、自動的に MainTimeline クラスが生成されます。
この場合、MovieClip クラスを継承しています。
「プロパティパネル」から、自作の Document クラスを作成する事もできます。
■ SDK の場合
SDK において、Document は、Main クラスに相当します。
■静的に配置した表示オブジェクトの登録場所について(Adobe Flash)
Adobe Flash において、最上位のタイムラインに配置した表示オブジェクトは、Document の表示リストに登録されています。
Stage の表示リストではありません。
■主要な表示オブジェクトにアクセスする
■自身の表示オブジェクトを取得する
this と記述すると、自身の表示オブジェクトにアクセスできます。
Adobe Flash の場合、最上位のタイムラインにて、this と記述すると、Document オブジェクトにアクセスできます。
■ Stage オブジェクトを取得する
stage と記述すると Stage オブジェクトにアクセスできます。
stage は、グローバル変数ではありません。
表示オブジェクトの stage プロパティです。(this.stage)
■ Document オブジェクトを取得する
Document オブジェクトを取得するには、Stage の表示リストの 0 番目にアクセスします。
Document オブジェクトを取得する
import flash.display.DisplayObjectContainer;
// Document オブジェクトを取得する
var document_obj:DisplayObjectContainer = stage.getChildAt(0) as DisplayObjectContainer;
// 出力テスト
trace(document_obj);
■ルートの表示オブジェクトを取得する
自身から、ルートの表示オブジェクトを取得するには、root プロパティを使用します。
親を1段階ずつ調べていき、
Loader が見つかった場合は、Loader オブジェクト
Document が見つかった場合は、Document オブジェクト
Stage が見つかった場合は、Stage オブジェクト
が得られます。
取得できるのは DisplayObject 型となります。
■親の表示オブジェクトを取得する
自身から、親の表示オブジェクトを取得するには、parent プロパティを使用します。
取得できるのは DisplayObject 型となります。
■ドットシンタックスによるアクセスついて
■静的に配置したオブジェクトのみ利用可能
ドットシンタックスは、静的に配置した表示オブジェクトのみ利用可能です。
動的に表示リストに登録した場合、ドットシンタックスを使ってアクセスする事はできません。
■あらかじめインスタンス名を付けておく
あらかじめ表示オブジェクトに、「インスタンス名」を付けておきます。
Flash を書き出すと「親の表示オブジェクト」に、「子の表示オブジェクト」と同じ名前のプロパティが追加されます。そのプロパティには、「子の表示オブジェクトの参照」が格納されています。
■ドットシンタックスを使ってアクセスする
this から開始して、インスタンス名をドットで連結していけば、相対パスで階層を辿って、任意の表示オブジェクトにアクセスできます。
parent と記述すると1つ上の階層へ登ることができます。
stage からドットシンタックスを利用することはできません。
■DisplayObject 型に注意
root と parent を使用すると DisplayObject 型として扱われるので、その後に続けてドットシンタックスを記述する事はできません。
この時、「未定義である可能性が高い○○○に静的型 flash.display:DisplayObjectContainer の参照を使用してアクセスしています。」というコンパイルエラーが表示されます。
Object 型にキャストしたり、配列アクセス演算子を使って、コンパイルエラーが出ないように回避する必要があります。
■ドットシンタックスの記述例
「一番上のタイムライン」に配置したムービークリップに "aaa" というインスタンス名を付けて、
その中に配置したムービークリップに "bbb" というインスタンス名をつけて、
その中に配置した2つのムービークリップにそれぞれ "ccc"、"ddd" というインスタンス名を付けたとします。
「一番上のタイムライン」から 「ムービークリップ "ccc"」にアクセスしたい場合は、以下のように記述できます。
静的に配置したムービークリップ ccc にアクセスする
trace(Object(root).aaa.bbb.ccc);
trace(this.aaa.bbb.ccc);
trace(Object(root).aaa.bbb.ccc.name);
trace(this.aaa.bbb.ccc.name);
「ムービークリップ "ccc"」 のタイムラインから 「ムービークリップ "aaa"」 にアクセスしたい場合は、以下のように記述できます。
静的に配置したムービークリップ ccc から、ムービークリップ aaa にアクセスする
trace(this.parent.parent);
trace(this.parent.parent.name);
「ムービークリップ "ddd"」 のタイムラインから 「ムービークリップ "ccc"」 にアクセスしたい場合は、以下のように記述できます。
静的に配置したムービークリップ ddd から、ムービークリップ ccc にアクセスする
trace(Object(this.parent).ccc);
trace(this.parent["ccc"].name);
表示オブジェクトを表示リストに登録する
■自身の表示リストに、任意の表示オブジェクトを登録する(位置指定)
自身の表示リストに、位置を指定して、任意の表示オブジェクトを登録するには、addChildAt() メソッドを使用します。
DisplayObjectContainer.addChildAt ( 表示オブジェクト , 位置 ) :DisplayObject
第01引数 | DisplayObject | 子として登録したい表示オブジェクトを指定 |
第02引数 | int | 登録したい表示リストの位置を指定。 0より小さいか、子の総数より大きい値を指定した場合はエラー。 |
戻り値 | DisplayObject | 登録した表示オブジェクト |
■表示優先度(奥行き)について
指定した位置にすでに表示オブジェクトが登録されている場合、挿入追加となります。
→ |
■使用例
テキストフィールドを、ステージの表示リストに登録する
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドA
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_a:TextField = new TextField();
// テキストフィールドの設定
text_field_a.x = 50;
text_field_a.y = 50;
text_field_a.width = 200;
text_field_a.height = 200;
text_field_a.background = true;
text_field_a.backgroundColor = 0xFFDDDD;
text_field_a.text = "TextField A";
// ------------------------------------------------------------
// テキストフィールドB
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_b:TextField = new TextField();
// テキストフィールドの設定
text_field_b.x = 100;
text_field_b.y = 100;
text_field_b.width = 200;
text_field_b.height = 200;
text_field_b.background = true;
text_field_b.backgroundColor = 0xDDFFDD;
text_field_b.text = "TextField B";
// ------------------------------------------------------------
// テキストフィールドC
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_c:TextField = new TextField();
// テキストフィールドの設定
text_field_c.x = 150;
text_field_c.y = 150;
text_field_c.width = 200;
text_field_c.height = 200;
text_field_c.background = true;
text_field_c.backgroundColor = 0xDDDDFF;
text_field_c.text = "TextField C";
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの 0 番目に登録する
stage.addChildAt(text_field_a, 0);
// ステージの表示リストの 1 番目に登録する
stage.addChildAt(text_field_b, 1);
// ステージの表示リストの 2 番目に登録する
stage.addChildAt(text_field_c, 2);
■自身の表示リストの最先頭に、任意の表示オブジェクトを登録する
自身の表示リストの最先頭に、任意の表示オブジェクトを登録するメソッドはありません。
かわりに、addChildAt() メソッドを使って実現します。
第01引数に、子として登録したい表示オブジェクトを指定します。
第02引数に、0 を指定します。
■表示リストの最先頭(0 番目)に登録した場合
→ |
■「表示リスト」の最先頭に「新しい表示オブジェクト」を登録する関数
第01引数に、親となる DisplayObjectContainer オブジェクトを指定します。
第02引数に、子となる DisplayObject オブジェクトを指定します。
成功すれば true、失敗すれば false が得られます。
「表示リスト」の最先頭に「新しい表示オブジェクト」を登録する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示リスト」の最先頭に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectContainerInsertFirstChild(parent:DisplayObjectContainer,child:DisplayObject) :Boolean{
var obj:DisplayObject = parent.addChildAt(child,0);
return (obj == child);
}
■使用例
ステージの表示リストの最先頭に、スプライトを登録する
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示リスト」の最先頭に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectContainerInsertFirstChild(parent:DisplayObjectContainer,child:DisplayObject) :Boolean{
var obj:DisplayObject = parent.addChildAt(child,0);
return (obj == child);
}
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite:Sprite = new Sprite();
// 矩形を描画
var g:Graphics = sprite.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// ステージの表示リストの最先頭に登録する
// ------------------------------------------------------------
DisplayObjectContainerInsertFirstChild(stage, sprite);
■自身の表示リストの最後尾に、任意の表示オブジェクトを登録する
自身の表示リストの最後尾に、任意の表示オブジェクトを登録するには、addChild() メソッドを使用します。
DisplayObjectContainer.addChild ( 表示オブジェクト ) :DisplayObject
第01引数 | DisplayObject | 子として登録したい表示オブジェクトを指定 |
戻り値 | DisplayObject | 登録した表示オブジェクト |
■表示リストの最後尾に登録した場合
→ |
■使用例
ステージの表示リストの最後尾に、スプライトを登録する
import flash.display.Sprite;
import flash.display.Graphics;
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite:Sprite = new Sprite();
// 矩形を描画
var g:Graphics = sprite.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
// ------------------------------------------------------------
stage.addChild(sprite);
■自身の直前に、任意の表示オブジェクトを登録する
自身の直前に、任意の表示オブジェクトを登録するメソッドはありません。
かわりに、addChildAt() メソッドを使って実現します。
自身の 「親表示オブジェクト」から呼び出します。
親は、自身の parent プロパティから取得できます。
第01引数に、「新しい表示オブジェクト」を指定します。
第02引数に、自身の登録位置を指定します。
■任意の表示オブジェクトと同じ位置に登録した場合
→ |
■「表示オブジェクト」の直前に「新しい表示オブジェクト」を登録する関数
第01引数に、基準となる DisplayObject オブジェクトを指定します。
第02引数に、新しい DisplayObject オブジェクトを指定します。
成功すれば true、失敗すれば false が得られます。
「表示オブジェクト」の直前に「新しい表示オブジェクト」を登録する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示オブジェクト」の直前に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectInsertBefore(obj_ref:DisplayObject,obj_new:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = obj_ref.parent;
if(!parent) return false;
var index:int = parent.getChildIndex(obj_ref);
var obj:DisplayObject = parent.addChildAt(obj_new,index);
return (obj == obj_new);
}
■使用例
スプライトAの直前に、スプライトBを登録する
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示オブジェクト」の直前に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectInsertBefore(obj_ref:DisplayObject,obj_new:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = obj_ref.parent;
if(!parent) return false;
var index:int = parent.getChildIndex(obj_ref);
var obj:DisplayObject = parent.addChildAt(obj_new,index);
return (obj == obj_new);
}
var g:Graphics;
// ------------------------------------------------------------
// スプライトA
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite_a:Sprite = new Sprite();
sprite_a.x = 100;
sprite_a.y = 100;
// 矩形を描画
g = sprite_a.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// スプライトB
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite_b:Sprite = new Sprite();
sprite_b.x = 150;
sprite_b.y = 150;
// 矩形を描画
g = sprite_b.graphics;
g.lineStyle (5, 0x0000AA, 1.0);
g.beginFill (0x4444FF, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録
stage.addChild(sprite_a);
// スプライトAの直前に、スプライトBを登録
DisplayObjectInsertBefore(sprite_a, sprite_b);
■自身の直後に、任意の表示オブジェクトを登録する
自身の直後に、任意の表示オブジェクトを登録するメソッドはありません。
かわりに、addChildAt() メソッドを使って実現します。
自身の 「親表示オブジェクト」から呼び出します。
親は、自身の parent プロパティから取得できます。
第01引数に、「新しい表示オブジェクト」を指定します。
第02引数に、自身の登録位置 + 1 を指定します。
■任意の表示オブジェクトの次の位置( + 1 )に登録した場合
→ |
■「表示オブジェクト」の直後に「新しい表示オブジェクト」を登録する関数
第01引数に、基準となる DisplayObject オブジェクトを指定します。
第02引数に、新しい DisplayObject オブジェクトを指定します。
成功すれば true、失敗すれば false が得られます。
「表示オブジェクト」の直後に「新しい表示オブジェクト」を登録する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示オブジェクト」の直後に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectInsertAfter(obj_ref:DisplayObject,obj_new:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = obj_ref.parent;
if(!parent) return false;
var index:int = parent.getChildIndex(obj_ref);
var obj:DisplayObject = parent.addChildAt(obj_new,index+1);
return (obj == obj_new);
}
■使用例
スプライトAの直後に、スプライトBを登録する
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「表示オブジェクト」の直後に「新しい表示オブジェクト」を登録する関数
// ------------------------------------------------------------
function DisplayObjectInsertAfter(obj_ref:DisplayObject,obj_new:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = obj_ref.parent;
if(!parent) return false;
var index:int = parent.getChildIndex(obj_ref);
var obj:DisplayObject = parent.addChildAt(obj_new,index+1);
return (obj == obj_new);
}
var g:Graphics;
// ------------------------------------------------------------
// スプライトA
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite_a:Sprite = new Sprite();
sprite_a.x = 100;
sprite_a.y = 100;
// 矩形を描画
g = sprite_a.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// スプライトB
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite_b:Sprite = new Sprite();
sprite_b.x = 150;
sprite_b.y = 150;
// 矩形を描画
g = sprite_b.graphics;
g.lineStyle (5, 0x0000AA, 1.0);
g.beginFill (0x4444FF, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録
stage.addChild(sprite_a);
// スプライトAの直後に、スプライトBを登録
DisplayObjectInsertAfter(sprite_a, sprite_b);
■表示リスト登録時の注意点
「任意の表示オブジェクト」を、複数の表示リストに登録することはできません。
すでに登録済みであった場合、以前の表示リストから外れます。
表示リストが循環するような登録はできません。
任意の表示リストに、自身の表示オブジェクトを登録する事はできません。
表示オブジェクトを表示リストから除外する
■自身の表示リストから、任意の表示オブジェクトを除外する
自身の表示リストから、「任意の表示オブジェクト」を除外するには、removeChild() メソッドを使用します。
DisplayObjectContainer.removeChild ( 表示オブジェクト ) :DisplayObject
第01引数 | DisplayObject | 表示リストから外したい表示オブジェクトを指定 |
戻り値 | DisplayObject | 外された表示オブジェクト |
■表示リストの変化について
表示リストから表示オブジェクトを除去すると、0 から昇順で番号が割振り直されます。
表示優先度(奥行き)については、こちらで解説しています。
→ |
■任意の表示オブジェクトから、自発的に外れる場合
除外される表示オブジェクトにとって、親が誰であるかを知っておく必要はありません。
親を取得するには、parent プロパティを使用します。
■「任意の表示オブジェクト」を表示リストから除外する関数
第01引数に、除外したい DisplayObject オブジェクトを指定します。
成功すれば true、失敗すれば false が得られます。
「任意の表示オブジェクト」を表示リストから除外する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 「任意の表示オブジェクト」を表示リストから除外する関数
// ------------------------------------------------------------
function DisplayObjectRemove(display_obj:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = display_obj.parent;
if(!parent) return false;
var obj:DisplayObject = parent.removeChild(display_obj);
return (obj == display_obj);
}
■使用例
スプライトを、ステージの表示リストから除外する
import flash.display.Sprite;
import flash.display.Graphics;
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite:Sprite = new Sprite();
// 矩形を描画
var g:Graphics = sprite.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
// ------------------------------------------------------------
stage.addChild(sprite);
// ------------------------------------------------------------
// ステージの表示リストから除外する
// ------------------------------------------------------------
stage.removeChild(sprite);
テキストフィールドを、ステージの表示リストから除外する
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
import flash.text.TextField;
// ------------------------------------------------------------
// 「任意の表示オブジェクト」を表示リストから除外する関数
// ------------------------------------------------------------
function DisplayObjectRemove(display_obj:DisplayObject) :Boolean{
var parent:DisplayObjectContainer = display_obj.parent;
if(!parent) return false;
var obj:DisplayObject = parent.removeChild(display_obj);
return (obj == display_obj);
}
// ------------------------------------------------------------
// テキストフィールドA
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_a:TextField = new TextField();
// テキストフィールドの設定
text_field_a.x = 50;
text_field_a.y = 50;
text_field_a.width = 200;
text_field_a.height = 200;
text_field_a.background = true;
text_field_a.backgroundColor = 0xFFDDDD;
text_field_a.text = "TextField A";
// ------------------------------------------------------------
// テキストフィールドB
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_b:TextField = new TextField();
// テキストフィールドの設定
text_field_b.x = 100;
text_field_b.y = 100;
text_field_b.width = 200;
text_field_b.height = 200;
text_field_b.background = true;
text_field_b.backgroundColor = 0xDDFFDD;
text_field_b.text = "TextField B";
// ------------------------------------------------------------
// テキストフィールドC
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_c:TextField = new TextField();
// テキストフィールドの設定
text_field_c.x = 150;
text_field_c.y = 150;
text_field_c.width = 200;
text_field_c.height = 200;
text_field_c.background = true;
text_field_c.backgroundColor = 0xDDDDFF;
text_field_c.text = "TextField C";
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_a);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_b);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_c);
// ------------------------------------------------------------
// ステージの表示リストから除外する
// ------------------------------------------------------------
// テキストフィールドBを表示リストから除外する
DisplayObjectRemove(text_field_b);
■自身の表示リストから、指定位置にある表示オブジェクトを除外する
自身の表示リストから、指定位置にある表示オブジェクトを除外するには、removeChildAt() メソッドを使用します。
DisplayObjectContainer.removeChildAt ( 登録位置 ) :DisplayObject
第01引数 | int | 登録位置を指定。0より小さいか、子の総数以上の値を指定した場合はエラー。 |
戻り値 | DisplayObject | 外された表示オブジェクト |
■表示リストの変化について
表示リストから表示オブジェクトを除去すると、0 から昇順で番号が割振り直されます。
表示優先度(奥行き)については、こちらで解説しています。
→ |
■使用例
登録位置を指定してステージの表示リストから除外する
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドA
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_a:TextField = new TextField();
// テキストフィールドの設定
text_field_a.x = 50;
text_field_a.y = 50;
text_field_a.width = 200;
text_field_a.height = 200;
text_field_a.background = true;
text_field_a.backgroundColor = 0xFFDDDD;
text_field_a.text = "TextField A";
// ------------------------------------------------------------
// テキストフィールドB
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_b:TextField = new TextField();
// テキストフィールドの設定
text_field_b.x = 100;
text_field_b.y = 100;
text_field_b.width = 200;
text_field_b.height = 200;
text_field_b.background = true;
text_field_b.backgroundColor = 0xDDFFDD;
text_field_b.text = "TextField B";
// ------------------------------------------------------------
// テキストフィールドC
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_c:TextField = new TextField();
// テキストフィールドの設定
text_field_c.x = 150;
text_field_c.y = 150;
text_field_c.width = 200;
text_field_c.height = 200;
text_field_c.background = true;
text_field_c.backgroundColor = 0xDDDDFF;
text_field_c.text = "TextField C";
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_a);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_b);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_c);
// ------------------------------------------------------------
// ステージの表示リストから除外する
// ------------------------------------------------------------
// テキストフィールドBの登録位置を取得する
var index:int = stage.getChildIndex(text_field_b);
// 登録位置を指定して表示オブジェクトを除外する
stage.removeChildAt(index);
表示オブジェクトの表示優先度(奥行き)を変更する
■表示優先度(奥行き)について
■表示リストの登録順序について
『表示リスト』の登録順序は、表示オブジェクトの表示優先度(奥行き)に影響があります。
表示リストの最先頭に登録するほど(登録位置が小さいほど)、奥に表示されます。
表示リストの最後尾に登録するほど(登録位置が大きいほど)、手前に表示されます。
■登録位置について
登録位置は、表示リストが更新されると変動します。
2 番目に登録したからといって、常に 2 番目に存在し続けるとは限りません。
(ActionScript 1.0 ~ 2.0 の、深度の様に取り扱う事はできません)
表示リストに、表示オブジェクトを追加した場合、0 から昇順で番号が割振り直されます。
→ |
表示リストから表示オブジェクトを除去した場合も、0 から昇順で番号が割振り直されます。
→ |
よって、数値で奥行きを管理するのは難しくなります。
番号ではなく、任意の表示オブジェクトを基準として、相対的に管理する事になります。
■表示オブジェクト同士の表示優先度を入れ替える(参照指定)
表示リストの順序を入れ替えるには、swapChildren() メソッドを使用します。
DisplayObjectContainer.swapChildren ( 1つ目の表示オブジェクト , 2つ目の表示オブジェクト ) :void
第01引数 | DisplayObject | 1つ目の表示オブジェクトを指定。 |
第02引数 | DisplayObject | 2つ目の表示オブジェクトを指定。 |
戻り値 | void | なし |
ステージの表示リストを入れ替える
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドA
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_a:TextField = new TextField();
// テキストフィールドの設定
text_field_a.x = 50;
text_field_a.y = 50;
text_field_a.width = 200;
text_field_a.height = 200;
text_field_a.background = true;
text_field_a.backgroundColor = 0xFFDDDD;
text_field_a.text = "TextField A";
// ------------------------------------------------------------
// テキストフィールドB
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_b:TextField = new TextField();
// テキストフィールドの設定
text_field_b.x = 100;
text_field_b.y = 100;
text_field_b.width = 200;
text_field_b.height = 200;
text_field_b.background = true;
text_field_b.backgroundColor = 0xDDFFDD;
text_field_b.text = "TextField B";
// ------------------------------------------------------------
// テキストフィールドC
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_c:TextField = new TextField();
// テキストフィールドの設定
text_field_c.x = 150;
text_field_c.y = 150;
text_field_c.width = 200;
text_field_c.height = 200;
text_field_c.background = true;
text_field_c.backgroundColor = 0xDDDDFF;
text_field_c.text = "TextField C";
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_a);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_b);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_c);
// ------------------------------------------------------------
// ステージの表示リストの登録順序を変更する
// ------------------------------------------------------------
// テキストフィールドAとテキストフィールドBを入れ替える
stage.swapChildren(text_field_a,text_field_b);
■表示オブジェクト同士の表示優先度を入れ替える(登録位置指定)
登録位置を指定して、表示リストの順序を入れ替えるには、swapChildrenAt() メソッドを使用します。
DisplayObjectContainer.swapChildrenAt ( 1つ目の登録位置 , 2つ目の登録位置 ) :void
第01引数 | int | 1つ目の登録位置を指定。 |
第02引数 | int | 2つ目の登録位置を指定。 |
戻り値 | void | なし |
登録位置を指定して、ステージの表示リストを入れ替える
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドA
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_a:TextField = new TextField();
// テキストフィールドの設定
text_field_a.x = 50;
text_field_a.y = 50;
text_field_a.width = 200;
text_field_a.height = 200;
text_field_a.background = true;
text_field_a.backgroundColor = 0xFFDDDD;
text_field_a.text = "TextField A";
// ------------------------------------------------------------
// テキストフィールドB
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_b:TextField = new TextField();
// テキストフィールドの設定
text_field_b.x = 100;
text_field_b.y = 100;
text_field_b.width = 200;
text_field_b.height = 200;
text_field_b.background = true;
text_field_b.backgroundColor = 0xDDFFDD;
text_field_b.text = "TextField B";
// ------------------------------------------------------------
// テキストフィールドC
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field_c:TextField = new TextField();
// テキストフィールドの設定
text_field_c.x = 150;
text_field_c.y = 150;
text_field_c.width = 200;
text_field_c.height = 200;
text_field_c.background = true;
text_field_c.backgroundColor = 0xDDDDFF;
text_field_c.text = "TextField C";
// ------------------------------------------------------------
// ステージの表示リストに登録
// ------------------------------------------------------------
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_a);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_b);
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field_c);
// ------------------------------------------------------------
// ステージの表示リストの登録順序を変更する
// ------------------------------------------------------------
// テキストフィールドAの登録位置を取得する
var index_a:int = stage.getChildIndex(text_field_a);
// テキストフィールドBの登録位置を取得する
var index_b:int = stage.getChildIndex(text_field_b);
// 登録位置を指定して、ステージの表示リストを入れ替える
stage.swapChildrenAt(index_a,index_b);
表示リストから表示オブジェクトを取得する
■表示リストに登録されている子の数を取得する
表示リストに登録されている子の数を取得するには、numChildren プロパティを使用します。
孫以下は、数に含まれません。
ステージに登録されている子の数を取得する
// 子の数を取得する
var count:int = stage.numChildren;
// 出力テスト
trace(count);
■任意の表示オブジェクトの登録位置を取得する
任意の表示オブジェクトの登録位置(表示リストの位置)を取得するには、getChildIndex()メソッドを使用します。
DisplayObjectContainer.getChildIndex ( 表示オブジェクト ) :int
第01引数 | DisplayObject | 調べたい表示オブジェクトを指定。親子関係ではない場合エラー。 |
戻り値 | int | 登録位置 |
テキストフィールドがどの位置に登録されているか調べる
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field:TextField = new TextField();
// テキストフィールドの設定
text_field.x = 50;
text_field.y = 50;
text_field.width = 200;
text_field.height = 200;
text_field.background = true;
text_field.backgroundColor = 0xFFDDDD;
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field);
// ------------------------------------------------------------
// 登録位置を取得する
// ------------------------------------------------------------
// テキストフィールドの登録位置を取得する
var index:int = stage.getChildIndex(text_field);
// 出力テスト
trace(index);
■任意の表示オブジェクトを取得する(登録位置指定)
登録位置を指定して、任意の表示オブジェクトを取得するには、getChildAt() メソッドを使用します。
DisplayObjectContainer.getChildAt ( 登録位置 ) :DisplayObject
第01引数 | int | 登録位置を指定 |
戻り値 | DisplayObject | 指定した登録位置にある表示オブジェクト。存在しない場合は null。 |
登録位置を指定して、表示オブジェクトを取得する
import flash.text.TextField;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field:TextField = new TextField();
// テキストフィールドの設定
text_field.x = 50;
text_field.y = 50;
text_field.width = 200;
text_field.height = 200;
text_field.background = true;
text_field.backgroundColor = 0xFFDDDD;
text_field.text = "表示テスト";
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field);
// ------------------------------------------------------------
// 登録位置を指定して、表示オブジェクトを取得する
// ------------------------------------------------------------
// テキストフィールドの登録位置を取得する
var index:int = stage.getChildIndex(text_field);
// 登録位置を指定して、表示オブジェクトを取得する
var display_obj:DisplayObject = stage.getChildAt(index);
// テキストフィールド型にキャストする
var tf:TextField = display_obj as TextField;
// 出力テスト
trace(tf.text);
■任意の表示オブジェクトを取得する(インスタンス名指定)
インスタンス名を指定して、任意の表示オブジェクトを取得するには、getChildByName() メソッドを使用します。
DisplayObjectContainer.getChildByName ( "インスタンス名" ) :DisplayObject
第01引数 | String | インスタンス名を指定 |
戻り値 | DisplayObject | 指定したインスタンス名を持つ表示オブジェクト。存在しない場合は null。 |
インスタンス名を指定して、表示オブジェクトを取得する
import flash.text.TextField;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field:TextField = new TextField();
// テキストフィールドの設定
text_field.x = 50;
text_field.y = 50;
text_field.width = 200;
text_field.height = 200;
text_field.background = true;
text_field.backgroundColor = 0xFFDDDD;
// インスタンス名を付ける
text_field.name = "my_textfield";
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field);
// ------------------------------------------------------------
// インスタンス名を指定して、表示オブジェクトを取得する
// ------------------------------------------------------------
// インスタンス名を指定して、表示オブジェクトを取得する
var display_obj:DisplayObject = stage.getChildByName("my_textfield");
// テキストフィールド型にキャストする
var tf:TextField = display_obj as TextField;
// 出力テスト
trace(tf.name);
■座標と当たり判定のある表示オブジェクトをすべて取得する
サンプルをダウンロード
指定した座標と当たり判定のある、表示オブジェクトをすべて取得するには、getObjectsUnderPoint() メソッドを使用します。
検索対象となるのは、表示オブジェクトコンテナの子孫のみです。
DisplayObjectContainer.getObjectsUnderPoint ( 座標 ) :Array
第01引数 | Point | 座標を指定 |
戻り値 | Array | Array 型。奥から順番に格納される。中身は表示オブジェクト。 |
指定した座標と当たり判定のある、表示オブジェクトをすべて取得する
import flash.text.TextField;
import flash.display.Sprite;
import flash.display.Graphics;
import flash.geom.Point;
// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドオブジェクトを作成する
var text_field:TextField = new TextField();
// テキストフィールドの設定
text_field.x = 50;
text_field.y = 50;
text_field.width = 200;
text_field.height = 200;
text_field.background = true;
text_field.backgroundColor = 0xFFDDDD;
text_field.text = "TextField A";
// ステージの表示リストの最後尾に登録する
stage.addChild(text_field);
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトオブジェクトを作成
var sprite:Sprite = new Sprite();
// スプライトの設定
sprite.x = 100;
sprite.y = 100;
// 矩形を描画
var g:Graphics = sprite.graphics;
g.lineStyle (5, 0xAA0000, 1.0);
g.beginFill (0xFF4444, 1.0);
g.drawRect (0,0,200,200);
// ステージの表示リストの最後尾に登録する
stage.addChild(sprite);
// ------------------------------------------------------------
// 指定した座標と当たり判定のある、表示オブジェクトをすべて取得する
// ------------------------------------------------------------
// 座標を用意
var pos:Point = new Point(150,150);
// 指定した座標と当たり判定のある、表示オブジェクトをすべて取得する
var ary:Array = stage.getObjectsUnderPoint(pos);
// 出力テスト
var i:int;
var num:int = ary.length;
for(i=0;i < num;i++){
trace(ary[i]);
}
■Adobe Flash から静的にグラフィックを配置した場合の注意点
Adobe Flash から静的にグラフィックを配置した場合、自動的に Shape オブジェクトが生成されます。
グラフィックは、Shape オブジェクトが保有している状態となります。
例えば、ムービークリップ内にグラフィックを描いて、Flash を書き出したとします。
Shape オブジェクトが自動的に生成され、MovieClip オブジェクトの子となります。
親である MovieClip オブジェクトはグラフィックを保有していません。
グラフィックが存在しないので、当たり判定を検出することができません。
子である Shape オブジェクトはグラフィックを保有しています。
グラフィックが存在するので、当たり判定を検出することができます。
よって、Adobe Flash から静的にグラフィックを配置した場合、Shape オブジェクトがヒットします。
Shape オブジェクトがヒットした場合、
parent プロパティを使用すると、本来の表示オブジェクトにアクセスできます。
■セキュリティサンドボックスについて
表示オブジェクトの種類によっては、セキュリティサンドボックスにより取得できない事があります。
セキュリティサンドボックスが原因で、取得に失敗した表示オブジェクトが存在するか調べるには、areInaccessibleObjectsUnderPoint() メソッドを使用します。
DisplayObjectContainer.areInaccessibleObjectsUnderPoint ( 座標 ) :Boolean
第01引数 | Point | 座標を指定 |
戻り値 | Boolean | 取得に失敗した表示オブジェクトが存在する場合 true。存在しない場合 false。 |
■表示リストに登録されているすべての表示オブジェクトを取得する
表示リストに登録されているすべての表示オブジェクトを取得するメソッドはありません。
かわりに、getChildAt() メソッドを使って実現します。
表示リストに登録されている子の数を取得するには、numChildren プロパティを使用します。
0 番目から順番にアクセスします。
■取得例
ステージの表示リストに登録されているすべての表示オブジェクトを取得する
import flash.display.Sprite;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトを生成
var sprite_a:Sprite = new Sprite();
var sprite_b:Sprite = new Sprite();
var sprite_c:Sprite = new Sprite();
// インスタンス名を付ける
sprite_a.name = "my_sprite_a";
sprite_b.name = "my_sprite_b";
sprite_c.name = "my_sprite_c";
// 表示リストに登録
stage.addChild(sprite_a);
stage.addChild(sprite_b);
stage.addChild(sprite_c);
// ------------------------------------------------------------
// ステージの表示リストに登録されているすべての表示オブジェクトを取得する
// ------------------------------------------------------------
// 子の総数
var num:int = stage.numChildren;
// 0 番目から順番にアクセスする
var i:int;
for(i=0;i < num;i++){
// 登録位置を指定して、表示オブジェクトを取得する
var obj:DisplayObject = stage.getChildAt(i);
// 出力テスト
trace("id:" + i + " name:" + obj.name);
}
■表示リストに登録されている子表示オブジェクトを配列で取得する関数
第01引数に、DisplayObjectContainer オブジェクトを指定します。
戻り値から、DisplayObject オブジェクトが、配列に格納された状態で得られます。
表示リストに登録されている子表示オブジェクトを配列で取得する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 表示リストに登録されている子表示オブジェクトを配列で取得する関数
// ------------------------------------------------------------
function DisplayObjectContainerGetChildren(container:DisplayObjectContainer) :Array{
var ary:Array = new Array();
var num:int = container.numChildren;
var i:int;
for(i=0;i < num;i++){
var obj:DisplayObject = container.getChildAt(i);
ary.push(obj);
}
return ary;
}
■すべての子孫表示オブジェクトを検索する
表示リストを巡ると、すべての子孫にアクセスすることができます。
再帰的に子孫を検索する例です。
■表示オブジェクトコンテナのすべての子孫を検索する関数
第01引数に、「基点となる表示オブジェクトコンテナ」を指定します。
第02引数に、コールバック関数を指定します。
戻り値から、コールバック関数で返したオブジェクトが得られます。
第02引数で指定する、コールバック関数の仕様です。
第01引数から、表示オブジェクトが得られます。
戻り値から、オブジェクトを返すと検索を終了します。
表示オブジェクトコンテナのすべての子孫を検索する関数
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
// ------------------------------------------------------------
// 表示オブジェクトコンテナのすべての子孫を検索する関数
// ------------------------------------------------------------
function DisplayObjectContainerFindAllDescendants(container:DisplayObjectContainer,func:Function):*{
var result:* = null;
function f(d:DisplayObjectContainer):*{
var i:int;
var num:int = d.numChildren;
var a:Array = new Array();
for(i=0;i < num;i++){ a[i] = d.getChildAt(i); }
for(i=0;i < num;i++){
result = func(a[i]);
if(result){ return result; }
d = a[i] as DisplayObjectContainer;
if(!d){ continue; }
result = f(a[i]);
if(result){ return result; }
}
return null;
}
return f(container);
}
■使用例
すべての子孫を検索する
import flash.display.Sprite;
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
import flash.utils.getQualifiedClassName;
// ------------------------------------------------------------
// 表示オブジェクトコンテナのすべての子孫を検索する関数
// ------------------------------------------------------------
function DisplayObjectContainerFindAllDescendants(container:DisplayObjectContainer,func:Function):*{
var result:* = null;
function f(d:DisplayObjectContainer):*{
var i:int;
var num:int = d.numChildren;
var a:Array = new Array();
for(i=0;i < num;i++){ a[i] = d.getChildAt(i); }
for(i=0;i < num;i++){
result = func(a[i]);
if(result){ return result; }
d = a[i] as DisplayObjectContainer;
if(!d){ continue; }
result = f(a[i]);
if(result){ return result; }
}
return null;
}
return f(container);
}
// ------------------------------------------------------------
// スプライト
// ------------------------------------------------------------
// スプライトを生成
var sprite_a:Sprite = new Sprite();
var sprite_b:Sprite = new Sprite();
var sprite_c:Sprite = new Sprite();
var sprite_d:Sprite = new Sprite();
var sprite_e:Sprite = new Sprite();
var sprite_f:Sprite = new Sprite();
var sprite_g:Sprite = new Sprite();
// インスタンス名を付ける
sprite_a.name = "my_sprite_a";
sprite_b.name = "my_sprite_b";
sprite_c.name = "my_sprite_c";
sprite_d.name = "my_sprite_d";
sprite_e.name = "my_sprite_e";
sprite_f.name = "my_sprite_f";
sprite_g.name = "my_sprite_g";
// 表示リストに登録
stage.addChild(sprite_a);
stage.addChild(sprite_b);
stage.addChild(sprite_c);
sprite_a.addChild(sprite_d);
sprite_d.addChild(sprite_e);
sprite_d.addChild(sprite_f);
sprite_f.addChild(sprite_g);
// ------------------------------------------------------------
// ステージから子孫すべての表示オブジェクトを取得する
// ------------------------------------------------------------
// コールバック関数を使って、ステージのすべての子孫を検索
DisplayObjectContainerFindAllDescendants(stage,function (display_obj:DisplayObject):*{
// 出力テスト
trace("current:" + display_obj.name + " parent:" + display_obj.parent.name + " className:" + getQualifiedClassName(display_obj));
// 検索を継続
return null;
});
// ------------------------------------------------------------
// 検索例
// ------------------------------------------------------------
// コールバック関数を使って、ステージのすべての子孫を検索
var sprite:Sprite = DisplayObjectContainerFindAllDescendants(stage,function (display_obj:DisplayObject):*{
// Sprite オブジェクトであるか調べる
if(display_obj as Sprite){
// インスタンス名が、"my_sprite_e" であるか調べる
if(display_obj.name == "my_sprite_e"){
// 検索を終了
return display_obj;
}
}
// 検索を継続
return null;
});
// 出力テスト
trace("name:" + sprite.name + " className:" + getQualifiedClassName(sprite));