当たり判定

(サンプル一覧を表示する)

FlashDevelop を使って、当たり判定の処理を入れてみました。
Flash の実行画面
当たり判定

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

当たり判定

ソースコード

package 
{
	import flash.display.SimpleButton;
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	
	/**
	 * 当たり判定のサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 埋め込み画像(敵キャラクタ)
		 */
		[Embed(source='../image/enemy.png')]
		private var image1:Class;
		
		/**
		 * 埋め込み画像(弾)
		 */
		[Embed(source='../image/bullet.png')]
		private var image2:Class;
		
		/**
		 * 敵キャラクタのビットマップ
		 */
		private var bitmap1:Bitmap;
		
		/**
		 * 弾のビットマップ
		 */
		private var bitmap2:Bitmap;
		
		/**
		 * 発射ボタンのラベル
		 */
		private var buttonText1:TextField;
		
		/**
		 * リセットボタンのラベル
		 */
		private var buttonText2:TextField;
		
		/**
		 * 発射ボタン
		 */
		private var button1:SimpleButton;
		
		/**
		 * リセットボタン
		 */
		private var button2:SimpleButton;
		
		/**
		 * 発射フラグ (発射ボタンが押されたら true)
		 */
		private var startFlag:Boolean = false;
		
		// ----------------------------------------------------------
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化用メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// 敵キャラクタ
			bitmap1 = Bitmap(new image1);
			RegisterBitmap(bitmap1, 240, 50, 2.0);
			
			// 弾
			bitmap2 = Bitmap(new image2);
			RegisterBitmap(bitmap2, 0, 60, 2.0);
			
			
			// ボタンのラベルの作成
			buttonText1 = new TextField();
			buttonText1.text = "発射";
			buttonText1.selectable = false;
			buttonText1.width = 40;
			buttonText1.height = 20;
			buttonText1.x = 80;
			buttonText1.y = 180;
			addChild(buttonText1);
			
			buttonText2 = new TextField();
			buttonText2.text = "リセット";
			buttonText2.selectable = false;
			buttonText2.width = 40;
			buttonText2.height = 20;
			buttonText2.x = 195;
			buttonText2.y = 180;
			addChild(buttonText2);
			
			// ボタンの作成
			button1 = new SimpleButton();
			button1.upState = makeRoundRect(0xDDDDDD, 100, 20, 10);
			button1.overState = makeRoundRect(0xFFFFFF, 100, 20, 10);
			button1.downState = makeRoundRect(0xBBBBBB, 100, 20, 10);
			button1.hitTestState = button1.upState;
			button1.addEventListener(MouseEvent.MOUSE_DOWN, onButtonMouseDown1);
			button1.x = 45;
			button1.y = 180;
			addChild(button1);
			
			button2 = new SimpleButton();
			button2.upState = makeRoundRect(0xDDDDDD, 100, 20, 10);
			button2.overState = makeRoundRect(0xFFFFFF, 100, 20, 10);
			button2.downState = makeRoundRect(0xBBBBBB, 100, 20, 10);
			button2.hitTestState = button1.upState;
			button2.addEventListener(MouseEvent.MOUSE_DOWN, onButtonMouseDown2);
			button2.x = 165;
			button2.y = 180;
			addChild(button2);
			
			// イベントの登録
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
			
		/**
		 * ステージにビットマップを登録して表示する
		 * @param	bitmap	表示するビットマップ
		 * @param	x		X 座標
		 * @param	y		Y 座標
		 * @param	scale	拡大率
		 */
		private function RegisterBitmap(bitmap:Bitmap, x:int, y:int, scale:Number):void
		{
			bitmap.smoothing = true;
			bitmap.cacheAsBitmap = true;
			bitmap.x = x;
			bitmap.y = y;
			bitmap.scaleX = scale;
			bitmap.scaleY = scale;
			addChild(bitmap);
		}
		
		/**
		 * 角丸の図形を描いたスプライトを作って返す
		 * @param	color	色
		 * @param	width	幅
		 * @param	height	高さ
		 * @param	round	角丸の大きさ
		 * @return	スプライト
		 */
		private function makeRoundRect(color:uint, width:int, height:int, round:int):Sprite
		{
			var s:Sprite = new Sprite();
			s.graphics.lineStyle(2);
			s.graphics.beginFill(color);
			s.graphics.drawRoundRect(0, 0, width, height, round);
			s.graphics.endFill();
			s.alpha = 0.3;
			return s;
		}

		/**
		 * 発射ボタンが押された時のイベントハンドラ
		 * @param	event
		 */
		private function onButtonMouseDown1(event:MouseEvent):void
		{
			// 発射フラグを立てる
			startFlag = true;
		}
		
		/**
		 * リセットボタンが押された時のイベントハンドラ
		 * @param	event
		 */
		private function onButtonMouseDown2(event:MouseEvent):void
		{
			// 敵キャラクタと弾を表示するようにして、弾を初期位置に戻す
			startFlag = false;
			bitmap1.visible = true;
			bitmap2.visible = true;
			bitmap2.x = 0;
		}
		
		/**
		 * フレーム開始イベント
		 * @param	event
		 */
		private function onEnterFrame(event:Event):void
		{
			// 発射フラグが立っている時は、弾を右に 3 ピクセルずつ動かす
			if (startFlag == true)
			{
				bitmap2.x += 3;
			}
			
			// 敵キャラクタと弾の当たり判定
			// 当たった時は、両方を画面に表示しないようにする
			if (bitmap1.hitTestObject(bitmap2))
			{
				bitmap1.visible = false;
				bitmap2.visible = false;
				startFlag = false;
			}
		}
		
	}
	
}		

Flash は、簡単に当たり判定を入れることができます。
座標の計算をする必要はありません。

hitTestObject() メソッドを呼び出して、
当たり判定をチェックしたいオブジェクトを引数に入れるだけです。
当たった時は、True が返ってきます。

また、hitTestPoint() というメソッドもあります。
こちらは、1 つの点に対する当たり判定を行います。
hitTestPoint() の方が負荷が少なくて済みます。

参照

外部リンク