2013-03-11 55 views
0

如标题所示,我遇到switch语句无法检查for循环中的i变量的问题是否存在某些值。下面的布尔函数模拟两个精灵之间的定向边界框碰撞,其中i变量表示面向边界框的每个面。但是,函数返回false时,i仅在值01中检查,并且函数返回true,i仅在值23检查。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*/ 
} 
+4

http://sscce.org/ please – 2013-03-11 20:13:41

+2

你在做什么来确定'我'是“只检查”在某些值?很显然,如果函数返回'false',它会提前退出'for i'循环,所以后面的'i'值可能会被忽略。 – 2013-03-11 20:25:18

+1

'deltaX'和'deltaY'甚至没有在这个函数中使用或定义。真的不清楚这段代码片段在做什么。 – 2013-03-11 20:27:10

回答

1

在我看来,你的结论是错误的,把cout << i << endl;case S之间,并确保你的结果。

我相信每个0..3将在每个迭代ot 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; 
    } 
+1

我怀疑错误是在第一个函数中返回false;在第二个函数中是'break;'; – 2013-03-11 20:33:07

+0

现在'i'确实增加了,在这种情况下我必须同意Mooing Duck,因为现在当语句返回'false'时,'for'循环只会在重新启动整个循环之前迭代到'1'。 – Blaze356 2013-03-11 20:48:01