レールと当たり判定 ~トロッコが落ちないように~
ゆっくりマインカート解説記事 一回目。
今回はレールとトロッコの当たり判定についてです。
GameMakerのプログラム的な話が続くので興味のある方だけどうぞ!
プレイ画面へはこちらから!
ゆっくりマインカート(ニコニコアツマール)
ゆっくりマインカートの記事のまとめはこちら
ゆっくりマインカートまとめページ(Cien)
プログラムの前提の話
当たり判定の処理はいろいろ方法があるのですが
最終的に以下のルールに落ち着きました。
- トロッコがレールの上に乗るようにする
- レールは横幅64ピクセルで一単位とする
- トロッコの横幅は48ピクセルとする
- レールは連続で並んでいたり、途中で途切れていることもある
- トロッコの前端、後端部分がレールに引っ掛かっていれば落ちないようにする
トロッコとレールの当たり判定部分
トロッコと3種類のレール(直進・上り坂・下り坂)には、
それぞれに下の図のように当たり判定を設定しています。
詳しく言うと、トロッコはスプライトのコリジョンマスクで設定し、
レールは線分データを各レールインスタンスの変数に記録させています。
上が使用画像で下が当たり判定(赤い部分)です
当たり判定処理
レールとトロッコの当たり判定は2段階に分けて行ってます。
第一段階はトロッコとレールがぶつかっているかどうかのチェック。
第一段階でぶつかっていると判断されると、第二段階でぶつかっている高さを算出します。
第一段階
レール(ピンク・黄色線)とトロッコ(青四角)でcollision_lineで当たり判定を行います。
レールの当たり判定の線は一本の長い線ではなく、
複数のレールの判定が連なった状態です。(ピンクの線、黄色の線一本が一つの当たり判定)
つまり、当たり判定後は下の4パターンの状態に分かれます。
-ピンクの線だけにぶつかっている
- 黄色の線だけにぶつかっている
- 両方の線にぶつかっている
- どっちにもぶつかってない
どちらかの線にぶつかったと判断されれば第二段階へ進みます。
第二段階
第二段階ではぶつかっ多と判断されるレール線分(ピンク線)と
トロッコの中心を通る垂線(青線)の交点(水色の点)を求めます。
Gamemaker では線分の交点を求める関数がないので、
適当に交点を算出する関数を作って交点を取得しました。
交点のyをそのままトロッコのyに代入すれば終了です。
感想
当たり判定って難しいなって感じでした。
当たり判定の突き抜けや接触判定時にトロッコが振動するなど、
3Dアクションゲームっぽいバグも発生して微調整に苦労した記憶があります。
バグの対処の過程で
image_angleを設定するとスプライトのコリジョンマスクも
一緒に回転する事を発見したりしました。(もっと早く知りたかった...)
スプライトのコリジョンマスクタイプをPreciseにしたら
もっと簡単に実装できたかもしれません。
次の機会で試してみたいと思います。
今回はここまで。
ありがとうございました。