我正在用C++和SDL开发一个小的2D平台/格斗游戏,我在碰撞检测方面遇到了一些麻烦。
这些关卡是由一组瓦片组成的,我使用一个for循环来遍历每个瓦片(我知道这可能不是最好的方法,我可能也需要帮助)。对于字符的每一侧,我将其在该方向上移动一个像素,并检查是否存在碰撞(我还会检查字符是否在该方向上移动)。如果有碰撞,我将速度设置为0,并将播放器移动到瓷砖的边缘。
我的问题是,如果我首先检查水平碰撞,并且播放器以每帧超过一个像素的速度垂直移动,则它会处理水平碰撞,并将角色移动到磁贴的一侧,即使磁贴在角色的下方(或上方)。如果我先处理垂直碰撞,它也会做同样的事情,只是它会处理水平轴。
如何在没有这些问题的情况下处理两个轴上的碰撞?有没有比我做的更好的方法来处理碰撞?
发布于 2010-04-17 02:53:03
是。基于矢量的碰撞将比基于瓦片的碰撞要好得多。将平铺的每一条边定义为线条(有捷径,但暂时忽略它们)。现在,要查看是否发生了碰撞,请找到最接近的水平线和垂直线。如果你取lastPos.x * LineVector.y - lastPos.y * LineVector.x的符号并与thisTurnsPos.x * LineVector.y - ThisTurnsPos.y * LinePos.x进行比较。如果这两个值的符号不同,则表示您已经越过了这条线。但是,这不会检查您是否已经越过了线段的末端。你可以在相同的lineVector和你的curPosition之间形成一个点积(这里有一个小错误,但可能已经足够好了),它要么是负的,要么大于这条线的幅值平方,你不在那条线段内,没有发生碰撞。
现在这是非常复杂的,你可能可以通过一个简单的网格检查,看看你是否已经进入了另一个正方形的区域。但!使用矢量的优点是它解决了移动速度比碰撞框大小更快的问题,(更重要的是),你可以使用非轴对齐的线进行碰撞。这个系统适用于任何2D矢量(并且通过一些按摩,3D也可以)。它还可以让你很容易地沿着碰撞框的边缘滑动你的角色,因为你已经完成了99%的数学运算,以找到碰撞后你应该在哪里。
我略过了一些实现细节,但我可以说我已经在无数的商业视频游戏中使用过上面的方法,它的效果非常好。祝好运!
https://stackoverflow.com/questions/2656943
复制相似问题