我正在使用 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”变量问题的方法,或者知道任何其他方法可以根据二维空间中的方向角度进行碰撞/反弹,当然(在简单的乒乓球环境中没有摩擦或重力)。