あまぐもホルン 2022/04/28 18:00

レールと当たり判定 ~トロッコが落ちないように~

ゆっくりマインカート解説記事 一回目。
今回はレールとトロッコの当たり判定についてです。
GameMakerのプログラム的な話が続くので興味のある方だけどうぞ!


プレイ画面へはこちらから!
ゆっくりマインカート(ニコニコアツマール)


ゆっくりマインカートの記事のまとめはこちら
ゆっくりマインカートまとめページ(Cien)


プログラムの前提の話

当たり判定の処理はいろいろ方法があるのですが
最終的に以下のルールに落ち着きました。

  • トロッコがレールの上に乗るようにする
  • レールは横幅64ピクセルで一単位とする
  • トロッコの横幅は48ピクセルとする
  • レールは連続で並んでいたり、途中で途切れていることもある
  • トロッコの前端、後端部分がレールに引っ掛かっていれば落ちないようにする

    トロッコとレールの当たり判定部分

    トロッコと3種類のレール(直進・上り坂・下り坂)には、
    それぞれに下の図のように当たり判定を設定しています。
    詳しく言うと、トロッコはスプライトのコリジョンマスクで設定し、
    レールは線分データを各レールインスタンスの変数に記録させています。


上が使用画像で下が当たり判定(赤い部分)です

当たり判定処理

レールとトロッコの当たり判定は2段階に分けて行ってます。
第一段階はトロッコとレールがぶつかっているかどうかのチェック。
第一段階でぶつかっていると判断されると、第二段階でぶつかっている高さを算出します。

第一段階


レール(ピンク黄色線)とトロッコ(青四角)でcollision_lineで当たり判定を行います。
レールの当たり判定の線は一本の長い線ではなく、
複数のレールの判定が連なった状態です。(ピンクの線、黄色の線一本が一つの当たり判定)
つまり、当たり判定後は下の4パターンの状態に分かれます。

-ピンクの線だけにぶつかっている
- 黄色の線だけにぶつかっている
- 両方の線にぶつかっている
- どっちにもぶつかってない

どちらかの線にぶつかったと判断されれば第二段階へ進みます。

第二段階


第二段階ではぶつかっ多と判断されるレール線分(ピンク線)
トロッコの中心を通る垂線(青線)交点(水色の点)を求めます。
Gamemaker では線分の交点を求める関数がないので、
適当に交点を算出する関数を作って交点を取得しました。
交点のyをそのままトロッコのyに代入すれば終了です。

感想

当たり判定って難しいなって感じでした。
当たり判定の突き抜けや接触判定時にトロッコが振動するなど、
3Dアクションゲームっぽいバグも発生して微調整に苦労した記憶があります。
バグの対処の過程で
image_angleを設定するとスプライトのコリジョンマスクも
一緒に回転する事を発見したりしました。(もっと早く知りたかった...)

スプライトのコリジョンマスクタイプをPreciseにしたら
もっと簡単に実装できたかもしれません。
次の機会で試してみたいと思います。

今回はここまで。
ありがとうございました。

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索