Мяч, проходящий через весло с определенных углов

Я создаю клон понг для школы с C ++ и SFML 2.1, и у меня есть небольшая проблема, когда мяч попадает в левую ракетку под острыми углами (проходит).

Правое весло отлично работает на всех углах, и, насколько я помню, они используют один и тот же код.

Вот код, который я использую для столкновения:

    for (auto& it : collisionPaddles)
{
if (this->ballShape.getGlobalBounds().intersects(it->getGlobalPaddleBounds()))
{
float deltaDistance = (this->y + this->radius) - (it->y + it->height / 2);
bool fromLeft = true;

if ((ballAngle < (3*myMath::MY_PI/2) && ballAngle > myMath::MY_PI/2))
{
fromLeft = false;
}
else
{
fromLeft = true;
}

ballAngle = static_cast<float>(deltaDistance * (myMath::MY_PI/180));

if (fromLeft)
{
ballAngle = static_cast<float>(myMath::MY_PI - ballAngle);
}
moveBall(2);
}
}

1

Решение

Это не тот способ, которым должен быть реализован хороший понг. Когда ваша физическая модель использует некоторые дельты, вы получаете много артефактов. Один из самых выдающихся — это объекты, проходящие сквозь друг друга. В таких простых случаях дельты следует использовать только для анимации.

Вот способ, которым я решил бы это. Когда мяч набирает начальную скорость и вектор движения, я рассчитываю весь путь, пока он не достигнет базовой линии игрока.

  1. Рассчитайте начальный луч из текущей позиции мяча, направленного так же, как он движется.
  2. Пересечь этот луч с сегментами которые состоят из границ вашего поля.
  3. Рассчитайте время, необходимое для достижения этой точки пересечения.
  4. Рассчитайте новый луч от точки пересечения к новому вектору движения.
  5. Повторяйте шаги 2-4, пока не достигнете базовой линии игрока. Сумма все время.

Теперь у вас есть относительное время удара с базовой линией и местом, где это произойдет. Теперь на каждом кадре вы должны

  1. Проверьте, было ли это время столкновения между предыдущим кадром и текущим. Если бы это было,
  2. Рассчитайте ожидаемую позицию весла в этот момент.
  3. Если сегмент весла содержит эту точку пересечения, это было отражено. Рассчитайте новый путь, как описано ранее.

Таким образом, вы получите истинную игровую механику, которая не ограничена большинством аспектов разработки игры, то есть FPS, внезапными лагами и т. Д.

0

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


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