0

Java で 2D プラットフォーマーを作成していますが、問題が発生しました。2 つのオブジェクトがあります。どちらにもバウンディング ボックスがあり、ボックスの角を表す 4 つの座標があります。

私の問題は、衝突をシミュレートする方法を見つけようとしていることですが、それができないようです。あらゆる場所を検索してみましたが、ほとんどのサイトは OpenGL 戦術を示しているだけです。

バウンディング ボックスの座標を次のように表します。

TL: 左上
TR: 右上
BL: 左下
BR: 右下

これが私が最初に衝突のテストを提案した方法です:

if(TL1 > TL2 && TL1 < TR2) //X-axis
    //Collision happened, TL1 corner is inside of second object
else if(BL1 < TL2 && BL1 > BL2) //Y-axis
    //Collision happened, BL1 corner is inside of second object

これは非常に大雑把な表示方法ですが、基本的にはコーナーが他のオブジェクトと交差しているかどうかを確認しています。問題は、両方の axii を考慮していないことです。つまり、一方のオブジェクトが他方の上にある場合でも x 衝突が発生します。

両方の軸で衝突をチェックすると、それが水平衝突か垂直衝突かを判断する方法がありません。あるいはあるかもしれないが、私はそれを理解していない。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

これは java.awt.Rectangle からのものです。

持っているコーディネートに合わせて変更できるはずです。

/**
 * Determines whether or not this <code>Rectangle</code> and the specified
 * <code>Rectangle</code> intersect. Two rectangles intersect if
 * their intersection is nonempty.
 *
 * @param r the specified <code>Rectangle</code>
 * @return    <code>true</code> if the specified <code>Rectangle</code>
 *            and this <code>Rectangle</code> intersect;
 *            <code>false</code> otherwise.
 */
public boolean intersects(Rectangle r) {
    int tw = this.width;
    int th = this.height;
    int rw = r.width;
    int rh = r.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
        return false;
    }
    int tx = this.x;
    int ty = this.y;
    int rx = r.x;
    int ry = r.y;
    rw += rx;
    rh += ry;
    tw += tx;
    th += ty;
    //      overflow || intersect
    return ((rw < rx || rw > tx) &&
            (rh < ry || rh > ty) &&
            (tw < tx || tw > rx) &&
            (th < ty || th > ry));
}
于 2013-10-11T00:16:30.937 に答える