AS3:ローカル変数としてaddChildされたオブジェクトを、後にremoveChildで消す基本的なやり方
()
グローバル変数で定義したオブジェクトは、
addChildした後、
他の関数からremoveChildでステージから消すことができますよね。
しかし、
ローカル変数で定義し、
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さんに訪ねてみたら、
「そういう時は、配列でいいと思います」とのこと。
配列使った例は以下の通りです。
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本ケースが当たりました。


