0

Java でかなり単純な 2D 衝突検出を実装していますが、衝突が発生した面(またはヒット ボックスの側面) を特定する方法に少しつまずいています。

私はこのサイトの質問に目を通し、他の場所で広範な Google-fu を試みましたが、最も近いものは次のようなものでした:

public Side getCollisionSide(Rectangle main, Rectangle incoming) {
    boolean toTheLeft = main.getX() - incoming.getX() < 0;
    boolean toTheTop = main.getY() - incoming.getY() < 0;
    // ...but what can I do from here?
}

問題は、これが実際にどちらの側に衝突したかを示していないことです。の座標として設定された原点を持つグリッドで、衝突が発生した象限を教えてくれます。mainしかし、オブジェクトmainが左から衝突した場合 (そしてたまたま Y 軸のフィールドの下にある場合)、この方法を使用しても、衝突が左から発生したのか下から発生したのかわかりません。

これに対する解決策、または単に別の実装を知っている人はいますか?

速度と方向の情報を持つことがいかに利点になるかがわかります (オブジェクトが一度に 1 つの次元しか移動できない場合は、解決策になることさえあります)。ただし、オブジェクトが斜めに移動できる場合、同じ問題を回避する方法がわかりません。

4

2 に答える 2

1

長方形には位置とサイズの情報しかないため、長方形以外にも多くの引数が必要です。四角形が衝突する場合、少なくとも 1 つの四角形が移動している必要がありますが、速度データは渡されません。Rectange をサブクラス化してみてください:

public class MovingRectange extends Rectangle {

  int xVelocity;
  int yVelocity;

  //etc
}

次に、MovingRectange インスタンスを getCollisionSide... に渡します。

于 2013-02-25T15:31:36.463 に答える
0

他の回答が指摘しているように、その情報を取得するには、より多くのパラメーターが必要です。

この問題はさまざまな方法で解決できます。これらの 2 つの三角形 (または少なくとも 1 つ) は移動可能であり、サイズは一定であると想定しています。この場合、たとえば、三角形の最後の 5 ~ 10 の位置をキューに保存して、その動きを追跡できます。シンプルさと抽象化のために、そのキューを長方形クラス内に保存することもできます。

以前の位置を保存する必要のない別の解決策は、位置をより頻繁に確認し (または位置の変更が発生したときに通知するようにトリガーを設定し)、長方形が小さなステップでのみ移動するように制限することです。トリガーに rectMoved(rectangleId, newPosition) のようなトリガーが含まれている場合、どの長方形が反対側にぶつかり、どちらの側からヒットしたかを簡単に知ることができます

乾杯

于 2013-02-25T15:43:38.067 に答える