1

次のコードでは、衝突は検出されますが、側面が正しく登録されません。

public int checkBoxes(int aX, int aY, int aWidth, int aHeight, int bX, int bY, int bWidth, int bHeight){

    /*
     * Returns int
     * 0 - No collisions
     * 1 - Top
     * 2 - Left
     * 3 - Bottom
     * 4 - Right
     */

    Vector2f aMin = new Vector2f(aX, aY);
    Vector2f aMax = new Vector2f(aX + aWidth, aY + aHeight);

    Vector2f bMin = new Vector2f(bX, bY);
    Vector2f bMax = new Vector2f(bX + bWidth, bY + bHeight);

    float left = bMin.x - aMax.x;
    float right = bMax.x - aMin.x;
    float top = bMin.y - aMax.y;
    float bottom = bMax.y - aMin.y;

    if(left > 0) return 0;
    if(right < 0) return 0;
    if(top > 0) return 0;
    if(bottom < 0) return 0;

    int returnCode = 0;

    if (Math.abs(left) < right)
    {
        returnCode = 2;
    } else {
        returnCode = 4;
    }

    if (Math.abs(top) < bottom)
    {
        returnCode = 1;
    } else {
        returnCode = 3;
    }

    return returnCode;
}

A が形状 B の上、左、または右に衝突している場合は 3 が返され、下に衝突している場合は 1 が返されます。何が原因なのかよくわかりません。コードの何が問題になっていますか?

4

2 に答える 2

2

これらの if ブロックを使用すると、最初のブロックで設定した内容とは関係なく、2 番目の if ブロックが常に実行されるため、常に1orを取得できます。3

if (Math.abs(left) < right)
{
    returnCode = 2;
} else {
    returnCode = 4;
}

if (Math.abs(top) < bottom)
{
    returnCode = 1;
} else {
    returnCode = 3;
}
于 2012-12-22T00:15:56.767 に答える
1

問題は、片側をチェックしていることですが、例によって左をチェックし、下も衝突している場合、それを無視しています。ここでコードをテストしました:http://wonderfl.net/c/i90L

私が最初にしたことは、辺の X と Y の距離を取得することでした。そして、どの距離が最大であるかを確認し、長方形自体のサイズを掛けます。これは、その辺が常に正方形の適切なエッジになるためです。

    Vector2f returnCode = new Vector2f(0, 0);

    returnCode.x = (Math.abs(left) - right) * aWidth;
    returnCode.y = (Math.abs(top) - bottom) * aHeight;

    int temp = 0;

    if(returnCode.x > 0){
        //Hits left
        temp = 2;
    }else{
        //Hits right
        temp = 4;
    }

    if(returnCode.y > 0){
        //Hits top
        if(returnCode.y > Math.abs(returnCode.x)){
            temp = 1;
        }
    }else{
        //Hits bottom
        if(returnCode.y < -Math.abs(returnCode.x)){
            temp = 3;
        }
    }

    return temp;
于 2012-12-22T15:53:45.467 に答える