0

タイトルが示すように、switchステートメントがループi内の変数を特定の値でチェックできないという問題が発生しています。以下のブール関数は、向きのあるバウンディング ボックスの各面を表す変数をfor使用して、2 つのスプライト間の向きのあるバウンディング ボックスの衝突をシミュレートします。iただし、関数が を返す場合falseiは値0およびでのみチェックされ、関数が を1返す場合は、 および の値でのみチェックされます。truei23

forこのエラーの原因がループなのかステートメントなのかわかりませんがswitch、衝突が方向付けられた境界ボックスのすべての面で機能するかどうかを再確認しました。実際に完全に機能します。どんな形の支援も喜んでいただければ幸いです!

衝突.cpp:

bool Collision::orientedBoundingBoxTest(const sf::Sprite &object1, const sf::Sprite &object2, int object1Width, int object1Height, int object2Width, int object2Height)
{
    /*Variables assigned and declared here*/

    for (int i = 0; i < 4; i++)
    {
        float faceX = collisionObject1.getPoint(i).x - collisionObject1.getPoint((i + 1) % 4).x;
        float faceY = collisionObject1.getPoint(i).y - collisionObject1.getPoint((i + 1) % 4).y;

        float perpendicularAxisX = -faceY;
        float perpendicularAxisY = faceX;

        float normalizedAxisLength = sqrt(perpendicularAxisX * perpendicularAxisX + perpendicularAxisY * perpendicularAxisY);
        perpendicularAxisX /= normalizedAxisLength;
        perpendicularAxisY /= normalizedAxisLength;

        float object1Min = std::numeric_limits<float>::max(), object1Max = -object1Min;
        float object2Min = std::numeric_limits<float>::max(), object2Max = -object2Min;

        for(int j = 0; j < 4; j++)
        {
            float object1Projection = (perpendicularAxisX * (collisionObject1.getPoint(j % 4).x + collisionObject1.getPosition().x) + perpendicularAxisY * (collisionObject1.getPoint(j % 4).y + collisionObject1.getPosition().y)) / (perpendicularAxisX * perpendicularAxisX + perpendicularAxisY * perpendicularAxisY);
            object1Min = min(object1Projection, object1Min);
            object1Max = max(object1Projection, object1Max);
        }

        for(int j = 0; j < 4; j++)
        {
            float object2Projection = (perpendicularAxisX * (collisionObject2.getPoint(j % 4).x + collisionObject2.getPosition().x) + perpendicularAxisY * (collisionObject2.getPoint(j % 4).y + collisionObject2.getPosition().y)) / (perpendicularAxisX * perpendicularAxisX + perpendicularAxisY * perpendicularAxisY);
            object2Min = min(object2Projection, object2Min);
            object2Max = max(object2Projection, object2Max);
        }

        switch (i) //Switch statement failing to check "i" variable at certain values
        {
        case 0:
            deltaY = -(object1Max - object2Min);
            break;
        case 1:
            deltaX = object1Min - object2Max;
            break;
        case 2:
            deltaY = object1Min - object2Max;
            break;
        case 3:
            deltaX = -(object1Max - object2Min);
            break;
        }

        if (! (object1Max >= object2Min && object1Min <= object2Max))
            return false;
    }
    return true;
}

エンジン.cpp:

void Engine::physics(sf::RenderWindow& _window)
{
    for (int i = 0; i < 5; i++)
    {
        if (collision.orientedBoundingBoxTest(collisionArray[i].collisionObjectSprite, player.playerSprite, collisionArray[i].width, collisionArray[i].height, player.width, player.height))
        {
            currentCollisionObjectIndex = i;
            player.hitTest = true;
            break;
        }
        else
        {
            player.hitTest = false;
        }
    }

    /*Additional code here*/
}
4

1 に答える 1

1

cout << i << endl;私の意見では、あなたの結論は間違っていcaseます。

ステートメントが呼び出されない限り、0..3各反復 ot でそれぞれが満たされると確信しています。ireturn

   switch (i)
    {
    case 0:
        deltaY = -(object1Max - object2Min); cout << i << endl;
        break;
    case 1:
        deltaX = object1Min - object2Max; cout << i << endl;
        break;
    case 2:
        deltaY = object1Min - object2Max; cout << i << endl;
        break;
    case 3:
        deltaX = -(object1Max - object2Min); cout << i << endl;
        break;
    }
于 2013-03-11T20:21:35.440 に答える