当たり判定
Kacotte!で使っている当り判定ロジックは以下の通り。
●床面マップで判定
床面マップには、その場所にある壁/障害物、赤リンゴ、毒リンゴの種類に応じたマップ値を格納しています。
これを見て、移動可否の判定やGet判定を行います。
一番低コスト(dupした変数で操作できる)ですが、移動前もしくは到着時など適切なタイミングで処理しないと、
マス目とキャラの位置関係に違和感がでたりします。
・魔物 対 アイテム類(赤リンゴ、毒リンゴ、壁)
魔物がこれらのアイテムの場所に重ならないように、移動先候補に該当する床面マップを値を持ってきて、
空であれば移動OKとしています。
壁/障害物を通り抜けないようにするのはもちろんですが、表示順の関係から、魔物が毒リンゴの場所に
移動すると裏に隠れることがあるので、それも回避しています。
(毒リンゴの位置にはステージ生成時にマップ値1を入れています。)
・プレーヤー 対 壁
移動先候補を求めた後、該当マップの値が壁/障害物でなけれは移動OKとしています。
・プレーヤー 対 赤リンゴ
こちらは移動先に到着した直後に該当マップの値を調べ、赤リンゴならGet判定としています。
●魔力マップで判定
・毒リンゴ 対 浄化エリア
毒リンゴ自体は動きませんが、敵オブジェクトとしてそれぞれ位置情報を持っています。
現マップ値が空でなければ浄化されたものとし、魔物を分離、床面マップに赤リンゴを設置しています。
●画面ピクセルのカラー情報で判定
・魔物 対 浄化エリア
魔物は常時動いており、マップ値での判定は面倒なため表示座標のピクセル値を使います。
浄化が掛かっているエリアのみ、ピクセルG値が253になるようにしてありますので、
単純にキャラ画像を表示する前のピクセル値を取得して判定しています。
●距離による判定
・プレーヤー 対 敵(毒リンゴ、魔物)
魔物やプレーヤーの移動途中であっても動く者どうしの当り判定を行う必要があります。
お互いの距離がどうなっているかで判断しています。
ちょっと計算コストがかかりますが、移動中、いつでも違和感なく判定が可能です。
プレーヤーと敵の衝突判定は矩形の衝突判定だと斜め方向が強すぎるので、以下のように三平方の定理による
距離判定としました。
c0= efx-egx c1= efy-egy c2=( (c0*c0+c1*c1)<EMDIST2 )
celputで使う表示座標についてX,Y各軸のプレーヤー座標との差を求め、それぞれ自乗した値を足し、
一定以下なら衝突と判定しています。
efx,efyはプレーヤーの表示座標、egx,egyは制御中の敵キャラの表示座標。衝突ならc2が1になります。
dupにより、c0(1)はc1、c0(2)はc2でもアクセス可能なので、実際のコーディングでは以下のように1行で処理。
c0=(efx-egx),(efy-egy),(c0*c0+c1*c1)<EMDIST2
暗黙の評価順を期待するためあまり推奨できませんが、これで16Bytes削減できます。
変数1つのdup処理に24Bytes要するものの、c0,c1,c2は汎用ワーク変数なので、適用できる所が多ければ十分ペイします。