衝突判定の重要性
衝突判定はゲームで多用されます。今回は敵機同士、弾丸と敵機、戦闘機と敵機で判定が必要です。またスマホなどでタッチした際に何をタッチしたか衝突判定ロジックで判断します。
難易度高し
衝突しているか判定するだけですがそのロジックは複雑になります。例えば次のように「主翼と尾翼が衝突しているか」、どうでしょうかプログラムで書けそうでしょうか?
もしプログラムで記述できたとしても複雑になることは間違いありません。そうなるとゲームレスポンスの問題が出てきます。例えば敵機が移動する度に残り敵機約30機と衝突判定する必要があります。これだけの処理を行うと遅くなってしまうかもしれません。せっかく複雑な処理が記述できたとしても処理が遅くなってしまうとゲーム性が損なわれるのです。
※スマホの3Dゲームで物体が物体をすり抜けることがあります。これは不具合というより、重要な場面でないなら、上記理由からあえて衝突判定を行っていないのです。
簡便な方法
ゲーム作成ツールの中にはレスポンスよく衝突判定ができるモノもありますが、今回はオーソドックスな方法で対応します。
衝突判定の簡便な方法として、物体の厳密な形状ではなく四角形とみなし衝突判定を行います。
判定に必要な情報は左上頂点の座標、横幅、縦幅です。
具体的なコードは次のようになります。
1 2 3 4 5 |
if( ((x1-lx2)<= x2) && (x2 <= (x1+lx1)) && ((y1-ly2)<= y2) && (y2 <= (y1+ly1)) ){ return true; } return false; |
ややこしいロジックです。衝突しているか?これを横軸、縦軸それぞれで考えるとわかりやすくなります。
このロジックを使い敵機と敵機、敵機と弾丸の衝突判定を行っていきます。