【问题标题】:Switch Statement within For Loop Failing to Check Variable at Certain ValuesFor 循环中的 switch 语句无法检查某些值的变量
【发布时间】:2013-03-11 20:12:15
【问题描述】:

正如标题所示,我遇到了switch 语句未能检查for 循环中的i 变量某个值的问题。下面的布尔函数模拟两个精灵之间的定向边界框碰撞,i 变量代表定向边界框的每个面。但是,当函数返回false时,i 仅在值01 处检查,而当函数返回true 时,i 仅在值23 处检查.

我不知道是 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;
}

Engine.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*/
}

【问题讨论】:

  • sscce.org
  • 您正在做什么来确定i 在某些值下“仅被检查”?很明显,如果函数返回false,它会提前退出for i循环,所以i后面的值可能会被跳过。
  • deltaXdeltaY 甚至没有在这个函数中使用或定义。实在不清楚这段代码sn-p是干什么的。
  • 我想说的是,当i 返回true 时,它不会检查01 的值,但看来我错了。
  • 我猜现在的问题是当for循环迭代时,只取deltaXdeltaY的最终值。 deltaXdeltaY 都是在单独的头文件中定义的 int 变量。它们确定两个定向边界框的距离之间的差异。

标签: c++ collision-detection game-physics sfml


【解决方案1】:

在我看来,你的结论是错误的,把cout &lt;&lt; i &lt;&lt; endl;放在cases之间,确保你的结果。

我确信每个0..3 都会在i 的每个迭代中相遇,除非调用return 语句。

   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;
    }

【讨论】:

  • 我怀疑错误是第一个函数中的return false; 或第二个函数中的break;
  • i 现在确实在增加,我必须同意 Mooing Duck 在这种情况下的观点,因为现在当语句返回 false 时,for 循环只会迭代到 1在重新启动整个循环之前。
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多