我正在使用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环境中没有摩擦或重力) )。
答案 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值的位置获取它们。