基于角度的C ++ SDL碰撞

时间:2012-07-16 02:33:31

标签: c++ sdl collision angle

我正在使用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度的角度下,如前所述,它会滞后并且有时弹跳不正确。

另一件事,我宣称“方向”(球的方向为rads)和“d_pi”(pi加倍)变量为浮点数但是当d_pi具有小数精度,如6.28318531弧度时,碰撞完全失败,没有发生弹跳但是当我将“d_pi”改为6.0或6.1之类的时候,碰撞就会起作用。我不知道为什么会出现这种错误,但在计算新方向时会造成不准确。

我想知道一种解决“d_pi”变量问题的方法,或者知道任何其他方法在2d空间中基于方向的角度进行碰撞/反弹,(在简单的pong环境中没有摩擦或重力) )。

1 个答案:

答案 0 :(得分: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(方向)和cos(方向),可能是交换的或者是一些系数。从更新x和y值的位置获取它们。