cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

【ゲームを作ろう】衝突を検知して当たり判定を考える1

オブジェクトの当たり判定を考えてみました。
まず、よくある方法から。

オブジェクトの衝突を定義する

よく書籍などで紹介されている方法です。
スプライトを正円(中心からの距離が一定の楕円ではない円)で綺麗に収まるようにデザインし、円と円の中心からの距離で判断する方法です。
ふなっしーとくまモンで計算してみるとこんな感じです。

円の距離

ふなっしー正円の中心と、くまモン正円の中心との距離を計算し、その距離が半径の和より小さくなったら円同士が重なる事になるので衝突と判断します。
ちなみに距離はピタゴラスの定理で斜辺を求める計算とイコールとなります。

ゲームに適用するには?

ここまでは簡単です。
では実際にゲーム内で考える当たり判定はどんな場面でしょうか?
単純に考えても

  • 敵と弾丸(主人公から発射した弾)の当たり判定
  • 敵と主人公の当たり判定
  • 主人公とアイテムの当たり判定
  • 主人公と障害物の当たり判定

の4つはありそうですし、主人公以外は複数存する在可能性が高いでしょう。
また、画面上で表示されているオブジェクトの組み合わせで当たり判定を行って、敵と弾丸は敵を倒し、敵と主人公はゲームオーバーなど当たりの種類によって動作を変える必要もありそうです。

各オブジェクトから判定を行う相手の数をみてみましょう。

1.敵は弾丸と主人公の2つ
2.主人公は敵とアイテムと障害物の3つ
3.弾丸は敵の1つ
4.アイテムは主人公の1つ
5.障害物は主人公の1つ

相手が多い方から判定するほうがループが少なくなりそうです。
また、重複する判定は無駄なので整理すると、

1.敵は弾丸と主人公の2つ
2.主人公はアイテムと障害物の2つ
から計算すると最小限の処理で済みそうです。

判定後の処理で動作を変えないといけないので、それぞれは別のクラスとして定義してシンプルに設計してみます。

継承

脳内設計ですが、親クラスに半径を設定、取得するメソッドと衝突判定と諸々の動作を行うメソッドを定義して、子クラスで実態を定義すると各スプライトに衝突後の動作を移譲することが出来そうです。

次回は実際にコードを書いて考えてみたいと思います。

Add a Comment

メールアドレスが公開されることはありません。