AS3:ローカル変数としてaddChildされたオブジェクトを、後にremoveChildで消す基本的なやり方

()
グローバル変数で定義したオブジェクトは、
addChildした後、
他の関数からremoveChildでステージから消すことができますよね。


しかし、
ローカル変数で定義し、
addChildしたオブジェクトは
他の関数からアクセスできないので、
単純にremoveChildだけで消すことは出来ません。


例えば以下のような例。


package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	/**
	 * ...
	 * @author 123
	 */
	public class Index extends Sprite {
		
		public function Index() {
			init();
		}
		
		//ステージ上にオブジェクトの「追加」「削除」ボタンをそれぞれ用意し、イベントを設定
		private function init():void{
			addBallBtn.addEventListener(MouseEvent.CLICK, addBall);
			addBallBtn.buttonMode = true;
			deleteBallBtn.addEventListener(MouseEvent.CLICK, deleteBall);
			deleteBallBtn.buttonMode = true;
		}
		
		//追加ボタンが押されたらローカル変数でオブジェクトを定義し、ステージに追加
		private function addBall(e:MouseEvent):void {
			var ball:Ball = new Ball();
			addChildAt(ball, 1);
			ball.x = Math.random()*stage.stageWidth;
			ball.y = Math.random()*stage.stageHeight;
		}
		
		//削除ボタンが押されたらaddBallメソッドでステージに追加されたballオブジェクトを削除
		private function deleteBall(e:MouseEvent):void {
			removeChild(ball);
		}
		
	}
}

import flash.display.Sprite;
	
	//赤いボールを描画するだけのBallクラス
	class Ball extends Sprite {
		public function Ball() {
			init();
		}
		
		private function init():void{
			graphics.beginFill(0xff0000);
			graphics.drawCircle(0, 0, 20);
			graphics.endFill();
		}
	}

これをパブリッシュすると、


1120:未定義のプロパティ ball へのアクセスです。


というエラーが出てきてしまいます。

deleteBallメソッドはballという変数を探すも、見つからないわけです。

addBallメソッドでballはローカル変数で定義されてしまったからです。


こういうとき、私はball変数を配列に突っ込んで処理していましたが、

何かプロはもっと違うやり方しているのか気になって、

学校でFlasherさんに訪ねてみたら、

「そういう時は、配列でいいと思います」とのこと。


配列使った例は以下の通りです。

ローカル変数でaddChild

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	/**
	 * ...
	 * @author 123
	 */
	public class Index extends Sprite {
		private var arr:Array = new Array();//配列を定義
		
		public function Index() {
			init();
		}
		
		private function init():void{
			addBallBtn.addEventListener(MouseEvent.CLICK, addBall);
			addBallBtn.buttonMode = true;
			deleteBallBtn.addEventListener(MouseEvent.CLICK, deleteBall);
			deleteBallBtn.buttonMode = true;
		}
		
		private function addBall(e:MouseEvent):void {
			var ball:Ball = new Ball();
			arr.push(ball);//配列に突っ込む
			addChildAt(ball, 1);
			ball.x = Math.random()*stage.stageWidth;
			ball.y = Math.random()*stage.stageHeight;
		}
		
		private function deleteBall(e:MouseEvent):void {
			if (arr.length != 0) {//配列要素が空ではなかったら
				var ball:Ball = arr.pop();//要素を取り出して
				removeChild(ball);//ステージから消す
			}
		}
		
	}
}

import flash.display.Sprite;
	
	class Ball extends Sprite {
		public function Ball() {
			init();
		}
		
		private function init():void{
			graphics.beginFill(0xff0000);
			graphics.drawCircle(0, 0, 20);
			graphics.endFill();
		}
	}

ここではわかりやすくするために

単純に配列要素をpopで取り出しているだけですが、

クリックされたボールを削除したりするには番号を割り当てたりします。


ASやってたら、一度くらいこのあたりでどうするか悩むんじゃないでしょうか...。


P.S

麦とホップの新春!国民的じゃんけん大会に応募したら、1000万円は獲得できなかったようですが、麦とホップの350ml×12本ケースが当たりました。

戦意

© 2012 戦意