两轴的2D Platformer碰撞问题

aus*_*gat 5 c++ sdl 2d collision-detection

我正在使用C ++和SDL开发一个小型2D平台游戏/格斗游戏,并且在碰撞检测方面遇到了很多麻烦。

这些关卡由一组拼贴组成,我使用一个for循环遍历每个贴砖(我知道这样做可能不是最好的方法,对此我可能也需要帮助)。对于角色的每一侧,我都将其沿该方向移动一个像素,并检查是否有碰撞(我还要检查角色是否沿该方向移动)。如果发生碰撞,我将速度设置为0,然后将播放器移至图块的边缘。

我的问题是,如果我首先检查水平碰撞,并且播放器每帧垂直移动一个像素以上,它将处理水平碰撞并将角色移动到瓷砖的侧面,即使瓷砖低于(或高于)性格。如果我先处理垂直碰撞,除了水平轴会执行相同操作外,其他操作都一样。

如何在没有这些问题的情况下处理两个轴上的碰撞?有没有比我做的更好的方法来处理碰撞?

cha*_*ian 5

XNA 的 2D 平台游戏示例也使用了基于 tile 的碰撞。他们在那里处理它的方式非常简单,可能对您有用。这是对那里内容的精简解释(删除特定于他们的演示内容):

  1. 之后将运动,它会检查碰撞。
  2. 它根据玩家的边界框确定玩家重叠的瓷砖。
  3. 它遍历所有这些图块......
    1. 如果被检查的瓷砖不合格:
    2. 它决定了玩家在 X 轴和 Y 轴上与不可通过的瓷砖重叠的距离
    3. 碰撞仅在浅轴上解决:
      1. 如果 Y 是浅轴(abs(overlap.y) < abs(overlap.x)),则 position.y +=overlap.y;同样,如果 X 是浅轴。
      2. 边界框根据位置变化更新
    4. 移动到下一个瓷砖...

如果您获取代码并想查看它们在那里具体做什么,它位于 HandleCollisions() 函数中的 player.cs 中。