Я создаю клон понг для школы с 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);
}
}
Это не тот способ, которым должен быть реализован хороший понг. Когда ваша физическая модель использует некоторые дельты, вы получаете много артефактов. Один из самых выдающихся — это объекты, проходящие сквозь друг друга. В таких простых случаях дельты следует использовать только для анимации.
Вот способ, которым я решил бы это. Когда мяч набирает начальную скорость и вектор движения, я рассчитываю весь путь, пока он не достигнет базовой линии игрока.
Теперь у вас есть относительное время удара с базовой линией и местом, где это произойдет. Теперь на каждом кадре вы должны
Таким образом, вы получите истинную игровую механику, которая не ограничена большинством аспектов разработки игры, то есть FPS, внезапными лагами и т. Д.