当たり判定を付ける準備


当たり判定領域を動作の1コマ1コマに付けたいのですが、どうしましょう。昨日書いたようなキャラの構成の場合、

キャラ
├ 待機
│ ├ グラフィック
│ └ 判定領域のディスプレイオブジェクト
├ 走り
│ ├ グラフィック
│ └ 判定領域の〜
├ ジャンプ
│ ├ グラフィック
│ └ 判定領域の〜
・
・
・

といったように動作ごとに、さらにその動作の1コマ1コマに1つずつ当たり判定のディスプレイオブジェクトをおいておく必要があります。さらに、当たり判定のシステムはキャラのクラスの外部に置いておきたいので、この判定領域もそれぞれ外部からアクセスできなければなりません。複雑すぎて鼻水が出そうですが、いいことを思いつきました。


待機や走りの各動作1コマ1コマは、動作一覧のビットマップから適切な1コマを複数切り抜いて、BitmapとしてFrameクラスに登録していくのですが、このBitmapを旨い事すれば判定領域をまとめておけそうです。

/**
 * ・オブジェクトグラフィッククラス
 */
package task.maingame.object
{
	import flash.display.BitmapData;
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.display.Shape;
	import lib.type.Size;
	import lib.utils.ShapeMaker;
	import flash.geom.Point;

	public class ObjectGraphic extends Sprite
	{
// ------------------------------------------------------------------------------------------------
// --プロパティ	-----------------------------------------------------------------------------------
		private var _bitmap			:Bitmap;	// メイングラフィックビットマップ
		private var _stageHitAreaSh	:Shape;		// ステージ当たり判定エリアシェイプ
		private var _damageHitAreaSh	:Shape;		// ダメージ当たり判定エリアシェイプ
		private var _attackHitAreaSh	:Shape;		// 攻撃当たり判定エリアシェイプ
// ------------------------------------------------------------------------------------------------
// --初期処理	-----------------------------------------------------------------------------------
		/**
		 * ■コンストラクタ
		 * 
		 * @param bitmapData	キャラビットマップデータ
		 * @param centerPoint	キャラ中心位置
		 */
		public function ObjectGraphic(bitmapData:BitmapData, centerPoint:Point)
		{
			var bmp:Bitmap = new Bitmap(bitmapData);
			
			bmp.x	= -centerPoint.x;
			bmp.y	= -centerPoint.y;
			
			_bitmap = Bitmap(addChild(bmp));
			
			_stageHitAreaSh		= null;
			_damageHitAreaSh	= null;
			_attackHitAreaSh	= null;
		}
// ------------------------------------------------------------------------------------------------
// --通常メソッド	-------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
// --プロパティの設定取得メソッド	---------------------------------------------------------------
		// ■ステージ当たり判定エリアシェイプ
		/**
		 * ■ステージ当たり判定エリアシェイプ設定
		 * 
		 * @param areaW	エリア横幅
		 * @param areaH	エリア高さ
		 */
		public function setStageHitArea(areaW:Number, areaH:Number):void
		{
			var areaSh:Shape = new ShapeMaker(0x00ff00, 0x00ff00).makeRectangle(10, 10);
			areaSh.alpha = 0.5;
			
			areaSh.width	= areaW;
			areaSh.height	= areaH;
			
			areaSh.x		= -areaW / 2;
			areaSh.y		= -areaH;
			
			_stageHitAreaSh = Shape(addChild(areaSh));
		}
		public function get stageHitArea():Shape	{ return _stageHitAreaSh;	}
		
		
		/**
		 * ■ダメージ当たり判定エリアシェイプ
		 * 
		 * @param areaSize		エリアサイズ
		 * @param areaPosition	エリア位置
		 */
		public function setDamageHitArea(areaSize:Size,areaPosition:Point = null):void
		{
			var areaSh:Shape = new ShapeMaker(0x0000ff, 0x0000ff).makeRectangle(10, 10);
			areaSh.alpha = 0.5;
			
			areaSh.width	= areaSize.w;
			areaSh.height	= areaSize.h;
			
			if (areaPosition == null)
			{
				areaSh.x	= -areaSize.w / 2;
				areaSh.y	= -areaSize.h;
			}
			else
			{
				areaSh.x	= areaPosition.x;
				areaSh.y	= areaPosition.y;
			}
			
			_damageHitAreaSh = Shape(addChild(areaSh));
		}
		public function get damageHitArea():Shape	{ return _damageHitAreaSh;	}
		
		/**
		 * ■攻撃当たり判定エリアシェイプ
		 * 
		 * @param areaSize		エリアサイズ
		 * @param areaPosition	エリア位置
		 * @param areaRotation	エリア角度
		 */
		public function setAttackHitArea(
			areaSize		:Size,
			areaPosition	:Point,
			areaRotation	:Number
		):void
		{
			var areaSh:Shape = new ShapeMaker(0xff0000, 0xff0000).makeRectangle(10, 10);
			areaSh.alpha = 0.5;
			
			areaSh.width		= areaSize.w;
			areaSh.height		= areaSize.h;
			
			areaSh.x			= areaPosition.x;
			areaSh.y			= areaPosition.y;
			
			areaSh.rotation		= areaRotation;
			
			_attackHitAreaSh	= Shape(addChild(areaSh));
		}
		public function get attackHitArea():Shape	{ return _attackHitAreaSh;	}
	}
}

ステージ、ダメージ、攻撃の3つの当たり判定領域を持った、キャラ動作の1コマに使うクラスです。Bitmapクラスを継承して拡張すれば...と思いましたが、Bitmapはコンテナじゃあないので、代わりにSpriteを継承します。ちょくちょく不明のクラスがありますが、名前から機能の推測をお願いします。(自分しか分からないような例を平然と挙げるという凶悪さ。)


実のところ今回のメインの話は「継承」でして、今までのキャラの動作の1コマとしていたクラスの代わりに、継承を使って拡張したクラスを使うことによって機能をまとめられたということが重要です。ようやく継承の使い方と便利さが実感できてきた気がします。