Проблема с ограничением угла

Я создаю игру, используя SFML 2.2 и Box2D. Игра похожа на Peggle в том, что у вас есть пушка, прикрепленная к верхней части экрана. У меня движение пушки в основном работает, но я хотел бы ограничить вращение, чтобы оно не могло вращаться и указывать прямо вверх (за пределы экрана). Я реализовал код ниже, и он работает в определенной степени. Пушка может двигаться хорошо в пределах границ, но если она попадает в одно из двух ребер, она застревает там. Если я нажимаю в противоположном направлении, вместо того, чтобы вращаться назад, он быстро переходит на противоположный край, в результате чего пушка оказывается либо полностью направо, либо полностью налево.

В моей игре, когда пушка направлена ​​прямо вниз, угол составляет 0/360 градусов, весь путь влево составляет 90 градусов, а весь путь вправо — 270 градусов.

//******************************/
// Aiming Controls
//******************************/
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Left))
{
float sin = sinf(-m_fRotationSpeed*elapsedTime);
float cos = cosf(-m_fRotationSpeed*elapsedTime);

sf::Vector2f newDirection;
newDirection.x = (cos*m_vAimDirection.x) - (sin * m_vAimDirection.y);
newDirection.y = (sin*m_vAimDirection.x) + (cos*m_vAimDirection.y);//Update sprite rotation
// Find angle of rotation by acos(v1dotv2)
float rotationAngle = acosf(1 * m_vAimDirection.y);

// Check to make sure we get the right direction!
if (m_vAimDirection.x < 0)
rotationAngle = (b2_pi*2.0f) - rotationAngle;

// convert to degrees
rotationAngle *= 180.0f / b2_pi;// HERE IS WHERE I CHECK THE BOUNDS
if (rotationAngle > 88.0f && rotationAngle < 272.0f)
rotationAngle = 88.0f;
else
m_vAimDirection = newDirection;//apply new rotation
m_sCannon.setRotation(rotationAngle);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Right))
{
float sin = sinf(m_fRotationSpeed*elapsedTime);
float cos = cosf(m_fRotationSpeed*elapsedTime);

sf::Vector2f newDirection;
newDirection.x = (cos*m_vAimDirection.x) - (sin * m_vAimDirection.y);
newDirection.y = (sin*m_vAimDirection.x) + (cos*m_vAimDirection.y);//Update sprite rotation
// Find angle of rotation by acos(v1dotv2)
float rotationAngle = acosf(1 * m_vAimDirection.y);

// Check to make sure we get the right direction!
if (m_vAimDirection.x < 0)
rotationAngle = (b2_pi*2.0f) - rotationAngle;

// convert to degrees
rotationAngle *= 180.0f / b2_pi;// HERE IS WHERE I CHECK THE BOUNDS
if (rotationAngle < 272.0f && rotationAngle > 88.0f)
rotationAngle = 272.0f;
else
m_vAimDirection = newDirection;
//apply new rotation
m_sCannon.setRotation(rotationAngle);
}

1

Решение

Задача ещё не решена.

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector