我正在用C ++和SFML 2.1为学校创建一个pong克隆,当球以锐角(它通过)击中左桨时,我遇到了一些问题。
右桨在所有角度都能正常工作,据我所知,它们使用相同的代码。
这是我用于碰撞的代码:
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);
}
}
答案 0 :(得分:0)
这不是应该实施好乒乓球的方式。当你的物理模型使用一些增量时,你会得到很多人工制品。最突出的一个是穿过彼此的物体。在这种简单的情况下,deltas应仅用于动画。
这是我解决它的方式。当球获得其初始速度和运动矢量时,我会计算整个路径直到它达到玩家的基线。
现在你有一个基线的相对时间和它将发生的位置。现在每一帧都应该
通过这种方式,您将获得不受游戏开发大多数方面限制的真实游戏机制,即FPS,突然滞后等。