トップページ > ゲーム制作 > 弾を削除する


配列で弾を管理するところまでは出来たので、次は弾を削除するコードを書いてみましょう。
弾を削除するというのは、
  • removeChild()で弾の描画を画面上から削除する
  • 弾を管理している配列から対象の弾を取り出す
の二つの作業になります。


public function check():Boolean
{
	if (x < -50 || stage.stageWidth  + 50 < x ||
		y < -50 || stage.stageHeight + 50 < y)
	{
		return true;
	}
 
	return false;
}
 
まず、Bulletクラスにcheck()というメソッドを用意します。
これは弾が画面外に出ているかどうかをチェックするためのメソッドです。
自分は英語がさっぱりなので適当にcheckというメソッド名にしましたが、名前を各自書き換えることをお勧めします。

xyプロパティは弾の中心部分の位置を表します。
if (x < 0)だと弾の中心部分が画面外に出た途端削除されてしまう、つまりまだ弾の半分が残っているうちに削除してしまうということです。
なので、if (x < -50)のように画面の境界からちょっと進んだ先で削除するように設定しましょう。


if (x < -RADIUS)
 
弾の半径値を変数 もしくは 定数で持っているならば、上のように書くのも有効です。


private function onEnterFrame(event:Event):void
{
	for (var i:int = 0; i < bullets.length; i++)
	{
		bullets[i].move();
		if (bullets[i].check())
		{
			removeChild(bullets[i]);
			bullets.splice(i--, 1);
		}
	}
}
 
後はMain側からBullet#checkを呼び出し、弾が画面外に出ていたらtrueが返ってきます。
そのときはremoveChild()で弾の描画を削除し、Array#spliceで配列からも削除するようにしましょう。

splice(i, 1)ではなくsplice(i--, 1)なので注意してください。(詳しくは →配列内の要素を削除する(注意編))


ちなみに上の削除する二行をBullet#checkに記述することも可能ですが、その場合はMainのSpriteと配列を前もってBulletオブジェクトに渡しておかなければなりません。
書き方は何通りもあって、どれが正しいとはいえないので色々と試してみることをお勧めします。



検証用コード
package
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite
	{
		private var bullets:Array;
		private const MAX:int = 100;
 
		public function Main()
		{
			bullets = new Array();
			for (var i:int = 0; i < MAX; i++)
			{
				var bullet:Bullet = new Bullet(0x0, 5, Math.random() * 465, Math.random() * 465);
				addChild(bullet);
				bullets.push(bullet);
			}
 
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		private function onEnterFrame(event:Event):void
		{
			for (var i:int = 0; i < bullets.length; i++)
			{
				bullets[i].move();
				if (bullets[i].check())
				{
					removeChild(bullets[i]);
					bullets.splice(i--, 1);
				}
			}
		}
	}
}
 
import flash.display.Sprite;
 
class Bullet extends Sprite
{
	public function Bullet(color:int, radius:int, x:int, y:int)
	{
		graphics.beginFill(color);
		graphics.drawCircle(0, 0, radius);
		graphics.endFill();
 
		this.x = x;
		this.y = y;
	}
 
	public function move():void
	{
		this.x += 3;
		this.y += 2;
	}
 
	public function check():Boolean
	{
		if (x < -50 || stage.stageWidth  + 50 < x ||
			y < -50 || stage.stageHeight + 50 < y)
		{
			return true;
		}
 
		return false;
	}
}
 

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|