Оператор переключения в цикле For, не проверяющем переменную при определенных значениях

Как следует из названия, у меня возникли проблемы с switch заявление не в состоянии проверить i переменная в пределах for зациклить определенные значения. Приведенная ниже булева функция имитирует столкновение ориентированной ограничительной рамки между двумя спрайтами с i переменная, представляющая каждую грань ориентированной ограничительной рамки. Тем не менее, когда функция возвращает false, i проверяется только при значениях 0 а также 1и когда функция возвращает true, i проверяется только при значениях 2 а также 3,

Я не знаю, является ли это 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*/
}

0

Решение

На мой взгляд, ваш вывод неверен, поставьте cout << i << endl; между caseи убедитесь, что ваши результаты.

Я уверен каждый 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]