プロが教えるわが家の防犯対策術!

C++でゲームのSTGのようなゲームを作成しています。

ショットの当たり判定は全て矩形で行っていますが、
レーザーのような細長いショットの場合、
どうしても斜め方向の判定が必要になってきます。

単純な回転しない矩形ならば、
それぞれの矩形の頂点座標の距離を比較するだけでいいので、
4回の比較で判定することができるのですが、
回転が加わってしまうとどうしても複雑になってしまい、
どういう風にとればいいのか解らずに困っています。

例えば、以下のような場合など、
回転を考慮しない判定だと衝突と判定されます。
     ┌――┐
     |   |
     |   |
  /\└――┘
/    \
\    /
  \/

解説サイト等を拝見しましたが、
矩形の回転の加わった当たり判定まで解説しているサイトが見当たらず、
ベクトルを使えば出来るという情報は得たものの
その方法が解らずに困っています。

シーンによっては多くのショットが生成されるので
付加をするならば、できる限り高速な処理で、判定をしたいのですけども、
どなたがその方法をご存じないでしょうか?

よろしくお願いします。

A 回答 (3件)

機体の中心点と弾の中心点の距離を求め「一定の距離以下は当たり」とすると、形状や角度などはすべて無視できます。



また、それぞれの物体に「当たる距離」を設定して「当たる距離の和を採用する」のも手です。

例:
物体Aの衝突距離4
物体Bの衝突距離3
物体Cの衝突距離8

AとBの距離が8の時⇒当たってない(衝突距離4+3=7、7<8)
AとCの距離が8の時⇒当たっている(衝突距離4+8=12、12>8)
BとCの距離が8の時⇒当たっている(衝突距離3+8=11、11>8)

こうすると衝突距離0同士の物体は「ぴったり同じ座標」になった場合にのみ衝突します。

この処理の前処理として「Xのみの距離」「Yのみの距離」を判定し、明らかに離れている(個々に設定してある衝突距離より遠い)場合は中心点同士の距離を計算しないで「当たってない」と判断します。

また、レーザーのように長い物は「中心点を並べて複数用意」し、串団子状の衝突範囲を設定すると良いでしょう。
    • good
    • 0

矩形=三角形二つ と見なして、複数の三角形同士のあたり判定でどうでしょう?

    • good
    • 1

正確に判定したいなら、


図形の方程式を連立するなどして、内積を求めたりするみたいですけど、

高速な処理を希望できしたら、
単純に、
弾の中心が機体を通過していたら、などと言う判定にしてみてはいかがでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!