2011/04/03

2Dの壁コリジョンをどうやって計算する?

先日思いついた2Dゲームで壁との衝突判定をどうやって行うかについてまとめておきます。

スーパーマリオやチャレンジャーなどファミコン時代によく遊んだ2Dゲームで壁に衝突すると壁に潜ってしまう方向の移動要素以外は生きて横に移動するというような操作を覚えている人も多いかと思います。
これはそんな感じにするための衝突判定です。

例えば横にのびている壁に斜めにあたった場合に、縦の移動は阻害されるけど、横への移動は許可されるというようなことです。

以下の図を見てください。
青い四角はキャラクター。
緑の四角は壁、白い矢印はキャラクターの移動方向となります。



壁に衝突する際に、キャラクター移動後のA,B,Cの3点での潜りを調べます。
キャラクターの進行方向にしたがって調べるべきA,B,Cの位置は変化しますが、要は移動に関係する3点です。

まずは左上の図を元に説明すると、
1:A,B,Cのすべてが潜らなければ希望する移動は許可される。
2:1でいずれかが衝突する場合には縦横どちらか、あるいは両方の移動が阻害されるので3以降の判定を行う。
3:Cが潜らなければ横方向の移動を許可し、縦方向は阻害される。


左下の図の場合は、
4:Aが潜らなければ縦方向の移動を許可し、横方向は阻害される。

さらにL字の壁の隅に移動しようとした場合などが当てはまりますが、
5:C,Aの両方が潜る場合はすべての移動が阻害される。

とすることでうまいこと壁との衝突を調べることが出来ます。

なお、派生系として右上と右下の場合もキャラクターのサイズを考慮して壁の角との潜りを調べて対応できます。
(おかしな判定を行うと角ギリギリを攻めると半分埋まりながら移動可能になってしまったりしますからね)

てなわけで、壁との判定をまとめてみました。
ひょっとすると1での判定はBのみの潜りを調べることで済むかもしれませんが、どうなんでしょう。

0 件のコメント:

コメントを投稿