我正在使用 C++ 和 SDL 开发一个小型 2D 平台游戏/格斗游戏,但在碰撞检测方面遇到了很多麻烦。
这些关卡由一系列图块组成,我使用 for 循环来遍历每个图块(我知道这可能不是最好的方法,而且我可能也需要这方面的帮助)。对于角色的每一侧,我将其朝该方向移动一个像素并检查是否发生碰撞(我还检查角色是否朝该方向移动)。如果发生碰撞,我将速度设置为 0 并将玩家移动到图块的边缘。
我的问题是,如果我首先检查水平碰撞,并且玩家每帧垂直移动超过一个像素,它会处理水平碰撞并将角色移动到图块的一侧,即使图块位于下方(或上方)人物。如果我首先处理垂直碰撞,它会执行相同的操作,只是它针对水平轴执行此操作。
如何处理两个轴上的碰撞而不出现这些问题?有没有比我这样做更好的处理碰撞的方法?
XNA 的 2D 平台游戏示例也使用基于图块的碰撞。他们的处理方式非常简单,可能对您有用。这是其中内容的精简解释(删除了特定于他们的演示的内容):
-
应用移动后,它会检查碰撞。
- 它根据玩家的边界框确定玩家重叠的图块。
- It iterates through all of those tiles...
- 如果正在检查的图块不合格:
- 它确定玩家在 X 轴和 Y 轴上与不可通过的图块重叠的距离
- Collision is resolved only on the shallow axis:
- 如果Y是浅轴(abs(overlap.y)
- 边界框根据位置变化进行更新
- 转到下一个图块...
如果您获取代码并想了解它们具体执行的操作,则可以在 player.cs 的 HandleCollisions() 函数中找到该代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)