GameMakerStudio2にて、
基本的なコリジョン判定(当たり判定)で手間取ったので、書き残しておきます。
オブジェクト/インスタンス(プレイヤーキャラ、敵キャラ、当たり判定のあるモノ等)の当たり判定をするのに、
似たようなファンクションがあって、当初、どれを使うえばいいのかよくわからなかったのですが、
検証して、よくわかったので書き残しておきます。
GM公式サイトのCommunity内でも何度も似たような質問があがってるみたいなので、みんな悩むんでしょうね。
キャラを回転させた状態で、bbox_left等のインスタンススプライトの端の座標値をコリジョン判定に使った時、うまくいかず、手間取ってしまった。これは、要注意。
※アドバンスのコリジョン判定機能(指定ライン上の当たり判定等)は、それぞれ特化機能があるので、除外します。
※もっと単純なコリジョン判定機能に、move系がありますが、負荷が高いので除外します。(単調なゲームならmove系を使うと楽)
基本的なコリジョン判定のファンクションが、以下の4つ。
それぞれの違いを書き記します。
1.obj同士のコリジョン判定2種(当たり判定の範囲は、お互いのobjのコリジョンマスクベース。x、yはあくまで自分のobjの位置を示す)
・place_meeting(x,y,obj) : obj(オブジェクト)同士のコリジョン判定をする。返り値は、True,Falseのみ。(当たり判定Yes,No) obj同士の当たり判定Yes/Noの判断だけする場合に使う。一応、instance_placeよりも、速いのではないか?とのこと。(相手のインスタンスidを調べないからか・・)
・instance_place(x,y,obj) : obj(オブジェクト)同士のコリジョン判定をする。返り値は、相手のインスタンスid。 相手のインスタンスidを知りたい場合は、こちらを使う。
2.obj同士のコリジョン判定2種(当たり判定は、指定座標と相手objのコリジョンマスク)
・position_meeting(x,y,obj) : 指定座標とobjのコリジョン判定。返り値は、True,Falseのみ。
・instance_position(x,y,obj) : 指定座標とobjのコリジョン判定。返り値は、相手objのインスタンスid。
2.の座標上のコリジョン判定は、ほぼイメージ通りなので、分かりやすい。
しかし、1.の2つのファンクションの考え方で、間違いやすいのが、指定x、y座標は、当たり判定座標ではないということ。その座標にコードを走らせてる自身のオブジェクトを位置取りした場合の自分のオブジェクトと相手オブジェクトとのコリジョン判定です。
ただ当たっているかどうかだけでなく、キャラが大きい場合にどの部分がぶつかってるか知りたい場合や、キャラを回転させた場合の当たり判定をチェックするときに、コリジョンマスク設定の精度が関係するので、適当だと、うまく機能しなくなる。
例えば、キャラクターが細長い場合、90度回転させると、当たり判定が全然違ってきます。その場合、そのスプライトは、コリジョンマスクをpreciseに設定すると、回転しても、正しく当たり判定できます。(当然、CPU負荷は増えますが・・・)
一方、キャラのスプライト上の上下左右の端の座標を知りたい場合、bbox_left、bbox_right、bbox_top、bbox_bottomというビルトイン変数があります。これをキャラを回転させて当たり判定に使おうとすると、そのままでは使えない・・・・ということがわかりました。残念ながら、bbox変数の値は、スプライトの回転に追従するBOXではありませんでした。bbox変数の値は、キャラを回転させた時でも、囲いの長方形は回転せず、あくまでも横幅と縦幅のBOXの値です。まあ、マニュアルにはそう書いてあります。使う場合は、気を付けたいですね。