表示リストから取り除くときの注意点

(section07-02 表示リストから抜粋)

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

fig07-02-09b.jpgswfを試す

[:script:]ステージの外に出たら表示リストから消す
//再生イベントでonNewFrower()を繰り返し実行する
addEventListener(Event.ENTER_FRAME, onNewFrower);
function onNewFrower(eventObj:Event):void {
	if (Math.random()<0.3) {
		//約30%の確率でflower_mcインスタンスを作る
		var flower_mc:FlowerA=new FlowerA();
		//最初の位置をステージより上に隠れたランダムな位置にする
		flower_mc.x=stage.stageWidth*Math.random();
		flower_mc.y=-20;
		//スケールを0.5〜1.5のランダムな大きさにする
		flower_mc.scaleX=flower_mc.scaleY=Math.random()+0.5;
		//表示リストに追加する
		addChild(flower_mc);
		//再生イベントのリスナー関数にonFrowerStepを登録する
		flower_mc.addEventListener(Event.ENTER_FRAME, onFrowerStep);
	}
}

//flower_mcの再生イベントで繰り返し実行する
function onFrowerStep(eventObj:Event):void {
	//再生イベントの対象のインスタンスを特定する
	var target_mc:MovieClip=eventObj.target as MovieClip;
	//スケールが小さいものほど速く回す
	target_mc.rotation+=Math.ceil(20/target_mc.scaleX);
	//左右に揺れながら降らせる
	target_mc.x+=4*Math.random()-2;
	target_mc.y+=5;
	//ステージより下まで来たら消去する
	if (target_mc.y>(stage.stageHeight+target_mc.height)) {
		//onFrowerStepリスナー関数を取り除く
		target_mc.removeEventListener(Event.ENTER_FRAME, onFrowerStep);
		//表示リストから取り除いて消す
		removeChild(target_mc);
	}
}
まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

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

このブログ記事について

このページは、oshigeが2009年7月 8日 21:10に書いたブログ記事です。

ひとつ前のブログ記事は「クリックした位置にインスタンスを作る」です。

次のブログ記事は「詳細!ActionScript 3.0入門ノート[完全改訂版]」です。

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

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