0

我正在使用 c++ 和 SDL 创建 Pong 克隆。

我正在尝试根据角度进行球的碰撞和反弹。我已经成功地创建了这样的方法,但是它在非常接近 90、180、270 或 0 度的角度下失败,这导致它有点滞后并且反弹不那么精确/正确。

这是使球在屏幕的所有边界内反弹的代码:

void Ball::wall_collision(SDL_Surface *S){

   //bounds of the screen
    if(x - radius < 0 || x + radius > S->w || y - radius < 0 || y + radius > S->h){

       // add 2*pi rads to current direction      
       direction = direction + d_pi;

    }
 }

这当然不会完全失败,球确实会正确弹跳,但会滞后并且有时会在接近 180,0,90,270 度的角度不正确地弹跳,就像之前声明的那样。

另一件事,我将“方向”(球的方向以弧度为单位)和“d_pi”(pi 加倍)变量声明为浮点数,但是当 d_pi 具有十进制精度(例如 6.28318531 弧度)时,碰撞完全失败,不会发生弹跳但当我将“d_pi”更改为 6.0 或 6.1 时,碰撞会起作用。我不知道为什么会发生该错误,但在计算新方向时会导致不准确。

我想知道一种解决“d_pi”变量问题的方法,或者知道任何其他方法可以根据二维空间中的方向角度进行碰撞/反弹,当然(在简单的乒乓球环境中没有摩擦或重力)。

4

1 回答 1

1

我的猜测是,在这些角度,由于某种原因,条件被满足了两次(因此更多次)。问题是你只是检查球的位置,而要反弹,它也必须朝着正确的方向前进。

尝试这个

if(x - radius < 0 && speed_x < 0 || x + radius > S->w && speed_x > 0 || y - radius < 0 && speed_y < 0 || y + radius > S->h && speed_y > 0) ...

这里 speed_x 和 speed_y 是 sin(direction) 和 cos(direction),可能交换或使用一些系数。从更新 x 和 y 值的位置获取它们。

于 2012-07-16T06:36:43.717 回答