ロゴ ロゴ

アクションゲームに使う衝突判定を作りました

はじめに

 9月の中旬くらいにはブログを出す予定だったはずが10月の初めになってしまったUmiです。
 本当は9月の初めには衝突判定については区切りがついていたのですが、まだ休みはあるから~と先延ばしした挙句IoT発表会(IoT講座が終わった後、IoTに関連した製作物を作り発表するイベントがあった)の準備で色々していたら、こんなことに……。ちなみに、IoT発表会ではテトリスを作ろうとしたら、色々とあって中途半端に終わりました。なので、完成したらブログで報告したいと思います。
 さて、話がそれましたが、本題のアクションゲームに使う衝突判定について話します。結果から言うとすごい妥協しました。というか妥協しないと永遠に続くんじゃないかと思うぐらい停滞しました。というわけで今回のブログは没になった衝突判定の考え方とその妥協案について書きたいと思います。

没になった案

 没になった案の判定方法は、線分と線分の衝突判定を使いました。しかし、言葉だけの説明だとわかりにくいので、図を下に載せておきます。

 上の図は、移動する物体(プレイヤーを想定)と静止物体(壁などを想定)との衝突の例です。また、物体はどちらも同じ大きさの正方形を想定しています。ここで判定に使うのは、移動する物体の頂点の軌跡(4本の線分)と静止物体の4辺です。この軌跡と辺が交わる=物体が衝突するということです。今回の場合、赤い線と青い線が交わっているので衝突しているということです。
 これならば、衝突するはずの物体が衝突をすり抜けることもなくなり、できればこの考え方で進めていきたかったのですが、これには大きな問題があることに気づきました。
 まず一つ目に移動する物体の横幅、縦幅どちらか一方でも静止している物体の横幅、縦幅より大きい場合衝突判定をすり抜けてしまう可能性があるということです。

 上の図がその例です。移動前、移動後の軌跡と4辺は交わっていませんが、中間地点を置くと物体は衝突していることが分かります。また、物体の形状が変わる(三角、丸など)ことによっても正しく判定されなくなります。
 二つ目に、このままの考え方では移動する物体同士の衝突判定が出来ないということです。これについては、対処法が全くと言っていいほど思いつきませんでした(もしかすると、移動する物体の一方を中心としてもう一方の物体を相対的に動かせば出来るかも?)。
 他にも色々問題はあり、この案が使える条件をまとめると
・移動する物体と静止している物体の衝突判定であること
・物体の当たり判定は四角形かつ移動する物体の横幅縦幅がそれぞれ静止している物体の横幅縦幅よりい小さいこと
 が挙げられます。
 ここで一番ネックなのが、移動する物体同士で判定できないことになります。

妥協案

 というわけでそれを解決するため妥協案を作りました。というより妥協案を作ってからもっと良い物を作ろうとした結果が没案なので、妥協案の方が先に作った原案ですが……。

 妥協案を図で説明すると上のようになります。これは衝突の条件を示していて、
①物体Aの右の辺(青い辺)が物体Bの左の辺(赤い直線)より右にあること
②物体Aの左の辺(青い辺)が物体Bの右の辺(赤い直線)より左にあること
③物体Aの下の辺(青い辺)が物体Bの上の辺(赤い直線)より下にあること
④物体Aの上の辺(青い辺)が物体Bの下の辺(赤い直線)より上にあること
 の4つです。この4つの条件を全て満たせば、衝突していることになります。
 この方法だと(斜めになっていない)長方形であれば大きさ関係なく判定でき、移動する物体同士でも、一方が静止していても同じ方法で判定できます。
 しかし、この方法では没案と違い判定のすり抜けが起きてしまうので、下の図のようにします。

 上のように移動前と移動後に中間地点を置くことで本来判定をすり抜けてしまうものも正しく判定することが出来ます。もちろん、移動がもっと激しいのなら、これでも正しく判定されないこともありますが、今回作るアクションゲームにはこれで十分だと思ったのでこれで妥協しました。

最後に

 アクションゲームの衝突判定を作り終えた後思ったことは、最初から妥協案使えばよかったということです。もちろん、没案を作るうえで色々と記事を読んで勉強にはなったので無駄ではなかったですが、費やした時間を考えると全く釣り合っていません。でも、結果は出せずとも必死に考えて何かをするのは好きなのでやっぱり良かったかもしれません。
 まあそれはさておき、衝突判定を調べているなかで個人的に良いサイトがあったので、参考のために載せておきます。没案で使っていた線分同士の判定もこのサイトに書いてあるものを使っていましたので、気になる方是非見てください。

衝突判定2D編-Qiita

蛇足

 今回はオンラインゲームを2つについて書きます。
・ファンタシスターオンライン2(pso2)
 SFよりのファンタジーの3Dアクションゲーム。プレイヤーはオラクルと呼ばれる宇宙船団の調査隊アークスとして色々な星を巡る。ファンタシスターオンライン2(略称pso2)の魅力はキャラクタークリエイトの自由度、豊富な着せ替え衣装など色々あるが、個人的には戦闘面が好きかもしれない。かもしれないと言うのは、pso2が好きな理由が自分でもよくわかってないからです。やったりやらなかったりが激しいですが割と昔からやってるので愛着が湧いたのかも?どうなんでしょうか。ちなみにpso2の続編が出ているのですが一切触れてません。いつか、時間がある時にやりたいなあ……
 
 ・メイプルストーリー
 約18年間続いている大御所2Dアクションオンラインゲーム。サービス終了しそうでしないゲームナンバー1(個人的に)。twitterでは公式が口を開けば、プレイヤーからの辛辣なコメントも多々。
 と色々悪そうな事書きましたが、個人的には好きなゲームです。というか、もし本当にサービス終了したら割とガチで泣くくらいめっちゃくっちゃ好きです。確かにメンテナンスあったら延長は日常茶飯事だったし、不正を行うプレイヤーが割と多いのに対処そこまでしないし、昔はパーティーが基本だったのに今じゃソロプレイ安定ですごい過疎ってたり……etc。それでも、グラフィック好みだし、たまに会うプレイヤーと話すとき楽しいし、ストーリー好きだし、何よりキャラクター強化方法が多数あるのが個人的には一番のポイントです。人によったらごちゃごちゃしていやという人もいますが……。
 ゲーム紹介してるはずなのにここまでの情報では何もわからないと思うのでちゃんと説明します。まず、最初に書いた通り横スクロール型2Dアクションゲームです。プレイヤーはまず25種類(たぶん)ある職業から一つ選ぶことができ、さらにその中の職業には転職してして別の職業になるものもあるため最終的には総職業数48種類(たぶん)から選ぶことになります。職業を決めてからはそれぞれのストーリーが始まり、そこから敵を倒し、レベルを上げ、スキルを覚え、さらに強い敵を倒したり、定期的に開催されるイベントに参加したりとそんな感じのゲームです。
 と言葉だけで話しても伝わりにくいと思います。ので、もし興味があるなら実際プレイしてみてください。

コメント入力

関連サイト