如标题所示,我遇到switch
语句无法检查for
循环中的i
变量的问题是否存在某些值。下面的布尔函数模拟两个精灵之间的定向边界框碰撞,其中i
变量表示面向边界框的每个面。但是,函数返回false
时,i
仅在值0
和1
中检查,并且函数返回true
,i
仅在值2
和3
检查。For循环内的语句无法在特定值检查变量
我不知道它是否是在for
环或switch
声明,是造成这个错误,我已经仔细检查,看是否碰撞适用于面向边界框的所有面,以我可以确认它确实可以完美地工作。任何形式的援助将非常感激!
Collision.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*/
}
http://sscce.org/ please – 2013-03-11 20:13:41
你在做什么来确定'我'是“只检查”在某些值?很显然,如果函数返回'false',它会提前退出'for i'循环,所以后面的'i'值可能会被忽略。 – 2013-03-11 20:25:18
'deltaX'和'deltaY'甚至没有在这个函数中使用或定义。真的不清楚这段代码片段在做什么。 – 2013-03-11 20:27:10