A3サイズの升目帖(旧)

ゲーム制作やプログラミングに関する雑記

マップの当たり判定を実装した

D言語くんがマップ上で跳ね回っている画面

いままでグラフィックだけのハリボテ状態だったマップに当たり判定を付けた。

ようやくゲームオブジェクトとブロックが接触できるようになったぞ。


せっかくなので、これを祝して D言語くん に登場してもらった。

D言語くんとは、D言語公式マスコットキャラクターだ。

D言語本体よりも有名」などと揶揄されることもある彼だが、その絶妙なプロポーションのデザインや、どこか憎めない雰囲気ゆえに、一部の熱狂的なファンに今なお愛されてやまない。

ゲーム内でもご覧のように大地を踏みしめ軽やかに跳ぶ雄姿を見せつけてくれる。


さて、ブロックとの接触はできたが…

ブロック対ゲームオブジェクトの当たり判定は完成した。

次にやるべきは ゲームオブジェクト対ゲームオブジェクト の当たり判定だな。

ブロックは格子状に並んでいるので最適化は楽だったが、ゲームオブジェクトはそうもいかない。

先のD言語くんみたいに縦横無尽に動き回るのだ。


筆者が意味を理解して実装できる当たり判定アルゴリズムは以下の3つくらいだ。

  1. 四分木
  2. 軸ソート法
  3. 総 当 た り

まあ 3. は論外として 1. か 2. かに絞られるんだが、今回のゲームはマップが縦にも横にも長くなりうるので、軸ソート法は不向きなんだよなあ。

初代スーパーマリオみたいに横長のマップしかないなら、オブジェクトの左側座標でソートをかけることで衝突の試行回数をぐっと減らせる。実装もめちゃ楽。

でもやっぱりゲームの性質上、四分木しかないよなあ…。あれ実装むずいんだよなあ…。