gpt4 book ai didi

基于角度的 C++ SDL 碰撞

转载 作者:行者123 更新时间:2023-11-28 08:00:52 24 4
gpt4 key购买 nike

我正在使用 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 加倍)变量声明为 float ,但是当 d_pi 具有小数精度(例如 6.28318531 弧度)时,碰撞完全失败,不发生弹跳,但当我将“d_pi”更改为 6.0 或 6.1 之类的值时,碰撞起作用了。我不知道为什么会出现该错误,但在计算新方向时会导致不准确。

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

最佳答案

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

试试这个

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 值的地方获取它们。

关于基于角度的 C++ SDL 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com