Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 乒乓球的二维碰撞检测_C++_Graphics_Collision Detection - Fatal编程技术网

C++ 乒乓球的二维碰撞检测

C++ 乒乓球的二维碰撞检测,c++,graphics,collision-detection,C++,Graphics,Collision Detection,我在玩乒乓球。我把所有的东西都画到屏幕上,弹起墙壁上的球,并确保划桨只能在地图上。我遇到的一个问题是碰撞检测。我正在使用的算法,如果球(实际上是一个正方形)击中中间的桨,而没有任何部分的球悬挂在桨叶边缘上,则效果很好。如果球撞到了球拍的角上,或者有些球挂在球拍上,那么球就会撞到球拍上,不会弹回。这是我的算法 bool CheckCollision(float Ax,float Ay,float Aw,float Ah,float Bx,float By, float Bw,float Bh) {

我在玩乒乓球。我把所有的东西都画到屏幕上,弹起墙壁上的球,并确保划桨只能在地图上。我遇到的一个问题是碰撞检测。我正在使用的算法,如果球(实际上是一个正方形)击中中间的桨,而没有任何部分的球悬挂在桨叶边缘上,则效果很好。如果球撞到了球拍的角上,或者有些球挂在球拍上,那么球就会撞到球拍上,不会弹回。这是我的算法

bool CheckCollision(float Ax,float Ay,float Aw,float Ah,float Bx,float By,
float Bw,float Bh) {
    if(Ax>Bx+Bw) {
        return(false);
    }else if(Ax+Aw<Bx) {
        return(false);
    }else if(Ay>By+Bh) {
        return(false);
    }else if(Ay+Ah<By) {
        return(false);
    }
    return(true);
} 
正如我所说的,如果球碰到中间的桨,

如果你明白这一点(因为我知道我不是最会说话的人),有没有办法让我的球不会滑入球拍?如果没有,我是否可以使用其他算法?请记住,这只是二维的

这是正在发生的事情的屏幕截图

正如你所看到的,球的每一边都没有碰撞,只有点

我希望这有帮助

ball->vellx=-ball->vellx

那是不对的

当检测到碰撞时,仅当球向桨移动时,才需要反转(x)速度。如果球已经离开球拍什么也不做,并且不修改速度

若你们在每次碰撞中都盲目地反转速度,那个么球就会卡在桨里

另外,还有一些事情你可以调整(比如让球正确地反弹到角落,根据球拍速度调整球的速度等等),但那是另一回事了

ball->vellx=-ball->vellx

那是不对的

当检测到碰撞时,仅当球向桨移动时,才需要反转(x)速度。如果球已经离开球拍什么也不做,并且不修改速度

若你们在每次碰撞中都盲目地反转速度,那个么球就会卡在桨里


另外,还有一些事情你可以调整(比如让球正确地反弹到角落,根据球拍速度调整球的速度,等等),但那是另一回事……

也许你可以尝试更小的时间步?不,不幸的是,这不起作用。每当球拍碰到球时,球似乎会进入球拍,或者球拍在球碰到球时移动。我仍然认为实施光线碰撞解决方案是最好的。也许你可以尝试更小的时间步?不,不幸的是,这不起作用。每当球拍撞到球时,球似乎会进入球拍,或者球拍在球碰到球时移动。我仍然认为实施光线碰撞解决方案是最好的。我该如何做呢?再次测试碰撞,但测试x和y值+它们的速度?@JakeRunzer:“再次测试碰撞,但测试x和y值+它们的速度”是的。这似乎工作得更好,但当球击中桨的顶部或底部时,似乎仍然存在问题。我认为问题在于碰撞检测返回真值并改变x速度而不是y速度。y速度只需要在球碰到桨的顶部或底部时改变。怎么做?@JakeRunzer:“怎么做?”找到最近的桨叶边缘(离球最近),如果球向边缘移动并发生碰撞,则反射速度向量。@JakeRunzer:如果球的中心位于桨叶中心的左侧,则球要么撞到左墙,要么没有碰撞。如果球的中心位于桨叶中心的右侧,则球要么撞到右墙,要么没有碰撞,以此类推(上/下等)。如果球的中心正好位于桨叶中心,则将球推到桨叶外侧的左侧或右侧(假设“blade.height>blade.width”)。我建议把这两种形状都画在纸上,仔细想想。我该怎么做呢?再次测试碰撞,但测试x和y值+它们的速度?@JakeRunzer:“再次测试碰撞,但测试x和y值+它们的速度”是的。这似乎工作得更好,但当球击中桨的顶部或底部时,似乎仍然存在问题。我认为问题在于碰撞检测返回真值并改变x速度而不是y速度。y速度只需要在球碰到桨的顶部或底部时改变。怎么做?@JakeRunzer:“怎么做?”找到最近的桨叶边缘(离球最近),如果球向边缘移动并发生碰撞,则反射速度向量。@JakeRunzer:如果球的中心位于桨叶中心的左侧,则球要么撞到左墙,要么没有碰撞。如果球的中心位于桨叶中心的右侧,则球要么撞到右墙,要么没有碰撞,以此类推(上/下等)。如果球的中心正好位于桨叶中心,则将球推到桨叶外侧的左侧或右侧(假设“blade.height>blade.width”)。我建议把这两种形状都画在纸上,仔细考虑一下。
if(CheckCollision(ball->x,ball->y,ball->width,ball->height,paddle->x,paddle->y,
paddle->width,paddle->height)) {
    ball->vellx = -ball->vellx;
}