如何使球以一定的角度从桨上弹起,这取决于它击中桨的位置?

时间:2014-11-16 17:42:15

标签: c++ math sfml angle pong

所以我对玩家桨和敌人桨有两个单独的碰撞检测,并且在玩家桨中我已经注释掉了什么似乎是根据击球位置弹跳球所需的数学计算。没有注释的代码只是在每次反弹时反转速度(它的速度是一个浮点值),就像你期望的那样在屏幕上反弹球。那么对于初学者来说,注释掉的公式实际上是正确的公式,如果是这样的话,当它与桨叶碰撞时需要应用于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);
}

1 个答案:

答案 0 :(得分:0)

cos(91)刚好低于-1,可能是因为冲击导致X方向反转并减慢速度。 sin(90)几乎是一个,所以可能意味着要慢一点。

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

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