Chap07 表示オブジェクトと表示オブジェクトコンテナの最近のブログ記事

 ActionScript 3.0 言語およびコンポーネントリファレンスでLoaderクラスの説明を見ると継承には次のように書いてあります。

継承:Loader→DisplayObjectContainer→InteractiveObject   →DisplayObject→EventDispatcher→Object

 これを見ると確かにLoaderクラスはDisplayObjectContainerクラスを継承しているので、MovieClipやSpriteなどと同じようにaddChild()を使って入れ子の表示オブジェクトを追加できるはずです。しかし実際にはLoaderが表示できるのは読み取り専用のcontantプロパティで参照できる表示オブジェクトだけです。
 その理由はコンポーネントリファレンスの説明の続きに書いてあります。そこには次のように書いてあります。

Loaderクラスの説明

Loader クラスは、継承する次のメソッドをオーバーライドします。これは、Loader オブジェクトが持つことができるのは 1 つの子表示オブジェクト、つまり読み込むオブジェクトに限られているためです。次のメソッドを呼び出すと例外がスローされます。メソッドは、addChild()、addChildAt()、removeChild()、removeChildAt() および setChildIndex() です。読み込まれた表示オブジェクトを削除するには、親の DisplayObjectContainer 子配列から Loader オブジェクトを削除する必要があります。

 p.225の表示リストの図でLoaderを二重枠にしていない理由はそういうわけでした。

fig07-02-06.jpg

(section07-03 表示オブジェクトの重なりの変更から抜粋)

 インデックス番号は表示オブジェクトコンテナに追加された順に付けられますが、正確には表示オブジェクトの重なり順です。したがって、重なり順を変更したり、インスタンスを削除するとインデックス番号も付け変わります。
 次のサンプルではロールオーバーした表示オブジェクトの重なりを最前面にします。重なりを最前面にするには、インデックス番号が大きい物ほど重なりが上になるので、表示オブジェクトのインデックス番号を子オブジェクトの個数-1に設定します(10行目)。子オブジェクトの個数は親オブジェクトのnumChildrenプロパティで調べることができます(8行目)。
fig07-03-03a.jpgswfを試す

[:script:]ロールオーバーした表示オブジェクトを最前面にする
box_mc.addEventListener(MouseEvent.ROLL_OVER, onRollover);
ball_mc.addEventListener(MouseEvent.ROLL_OVER, onRollover);
penta_mc.addEventListener(MouseEvent.ROLL_OVER, onRollover);
//ロールオーバーで実行
function onRollover(eventObj:MouseEvent):void {
	var mc:MovieClip=eventObj.target as MovieClip;
	//子オブジェクトの個数-1
	var lastIndex:int=mc.parent.numChildren-1;
	//インデックス番号をセットする
	mc.parent.setChildIndex(mc,lastIndex);
}
(section07-02 表示リストから抜粋)

 表示オブジェクトをメモリから消去する場合、イベントのリスナー関数を登録したままだとイベントが発生したタイミングで参照エラーになるので注意が必要です。表示オブジェクトを表示リストから取り除く際には、登録しておいたイベントのリスナー関数を忘れずに取り除かなければなりません。Event.ENTER_FRAMEイベントなどは表示リストに登録していなくてもイベントが発生します。
 次のサンプルは、FlowerAクラスのインスタンスを再生イベントの繰り返しを利用して作成し、ステージの上から下へと回転しながら降らせるムービーです。このサンプルではインスタンスを大量に作成しますが、作成してすぐに表示リストに追加するので、アニメーションの途中でメモリから消去されてエラーになることはありません。また、インスタンスを回転しながら降らせるためにインスタンスに再生イベントのリスナーonFrowerStep()を登録していますが、表示リストから消去する前にこのリスナー関数も取り除いています。

fig07-02-09b.jpgswfを試す

(section07-01 表示オブジェクトの追加から抜粋)

 次のサンプルではクリックした位置に花のインスタンスを作ります。先のサンプルと同じように表示するフレームとスケールはランダムに決めています。インスタンスの座標は6〜7行目でクリックした座標に設定しています。クリックした座標はMouseEvent.MOUSE_DOWNイベントの引数のイベントオブジェクトのstageX、stageYプロパティで取り出せます。
fig07-01-08b.jpgswfを試す

[:script:]クリックした位置にインスタンスを作る
1	stage.addEventListener(MouseEvent.MOUSE_DOWN, newFlower);
2	//クリックでインスタンスを作る
3	function newFlower(eventObj:MouseEvent):void {
4		var flower_mc:Flowers=new Flowers();
5		//クリックした座標に表示する
6		flower_mc.x=eventObj.stageX;
7		flower_mc.y=eventObj.stageY;
8		//スケールを0.8〜3.8の間でランダムに決める
9		var scale:Number=0.8+3*Math.random();
10		flower_mc.scaleX=flower_mc.scaleY=scale;
11		//表示するフレームをランダムに決める
12		var frame:uint=1+Math.floor(flower_mc.totalFrames*Math.random());
13		flower_mc.gotoAndStop(frame);
14		//ステージに表示する
15		addChild(flower_mc);
16	}	
まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

楽しいActionScript。
新たなる1歩へと踏み出しましょう。
■内容は?→ 目次を見る
■評判は?→ 書評を読む
この本を書いたわけ

このアーカイブについて

このページには、過去に書かれたブログ記事のうちChap07 表示オブジェクトと表示オブジェクトコンテナカテゴリに属しているものが含まれています。

前のカテゴリはChap06 PointクラスとRectangleクラスです。

次のカテゴリはChap08 クラス定義です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ