c++ - 如何根据球击中 Racket 的位置使球以特定角度从 Racket 上反弹?

标签 c++ math sfml angle pong

因此,我对玩家 Racket 和敌人 Racket 进行了两次单独的碰撞检测,并且在玩家 Racket 中,我已经注释掉了根据球击中的位置反弹球所需的数学计算。没有注释的代码只是让球在屏幕上弹跳,就像您在每次弹跳时反转速度(它的速度是一个浮点值)时所期望的那样。那么对于初学者来说,注释掉的公式实际上是正确的公式吗?如果是这样,当它与桨碰撞时是否需要同时应用于 xSpeed 和 ySpeed?

当我看到这个公式时,它以 BallAngle 或 PaddleAngle 作为参数(老实说我不记得了)。现在,如果这是正确的公式,我如何首先获得该角度?我只是在那里使用整数(用于测试),因为我不知道如何获得角度。

if (ball.getPosition().x < (player.getPosition().x) //PLAYER COLLISION DETECTION
&& (ball.getPosition().y + (ball.getRadius() * 2)) >= player.getPosition().y
&& ball.getPosition().y <= (player.getPosition().y + player.getSize().y))
{
    xSpeed = -xSpeed;
    //xSpeed = xSpeed*cos(91);
    //ySpeed = ySpeed*sin(90);
    ball.move(xSpeed, ySpeed);              
}

if (ball.getPosition().x > enemy.getPosition().x - 30 //ENEMY COLLISION DETECTION
&& (ball.getPosition().y + (ball.getRadius() * 2)) >= enemy.getPosition().y
&& ball.getPosition().y <= (enemy.getPosition().y + enemy.getSize().y))
{
    xSpeed = -xSpeed;
    ball.move(xSpeed, ySpeed);
}

最佳答案

cos(91)刚好低于-1,估计是为了反转X方向,受冲击减慢速度。 sin(90) 几乎是一个,所以大概是为了让它慢一点。

当然,这些函数实际上计算起来非常昂贵,因此您也可以对这些值进行硬编码。

const float xBounce = -0.99436746092
const float yBounce = 0.8939966636  
...
xSpeed *= xBounce;
ySpeed *= yBounce;
ball.move(xSpeed, ySpeed);

关于c++ - 如何根据球击中 Racket 的位置使球以特定角度从 Racket 上反弹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26960039/

相关文章:

javascript - 应用斐波那契数列,处理大数

c++ - 优化在网格图中查找哈密顿循环的函数?

c++ - 基于时间的事件处理

C++ pow() - 浮点类型不匹配

c++ - macOS上的wxWidgets暗模式

c++ - std::variant的参数归纳

math - float 学有问题吗?

c++ - 在结构中访问 std::list 会引发段错误

javascript - 如何根据输入值及其概率计算最有可能的输出?

c++ - 使用像素阵列在 SFML 中操作图像