c++ - 双轴的 2D 平台游戏碰撞问题

标签 c++ 2d sdl collision-detection

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

关卡由一组图 block 组成,我使用 for 循环遍历每个图 block (我知道这可能不是最好的方法,我可能也需要帮助)。对于角色的每一侧,我将它朝那个方向移动一个像素并检查碰撞(我还检查角色是否朝那个方向移动)。如果发生碰撞,我将速度设置为 0 并将玩家移动到方 block 的边缘。

我的问题是,如果我首先检查水平碰撞,并且播放器以每帧超过一个像素的速度垂直移动,它会处理水平碰撞并将角色移动到图 block 的一侧,即使图 block 在下方(或以上)角色。如果我先处理垂直碰撞,它会做同样的事情,除了它是为水平轴做的。

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

最佳答案

XNA's 2D platformer example也使用基于图 block 的碰撞。他们处理它的方式非常简单,可能对您有用。这是对其中内容的精简解释(删除特定于他们的演示的内容):

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

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

关于c++ - 双轴的 2D 平台游戏碰撞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656943/

相关文章:

c++ - 在C++中将字符串转换为整数数组

c - Flatindexed 2D array - 垂直/水平翻转图像

c - sdl中对象自动移动

c++ - 你如何将 CString 和 std::string std::wstring 相互转换?

c++ - 什么时候返回右值引用会导致未定义的行为?

c++ - 使用抽象指针调用派生类函数

c++ - 检查二维数组中相邻方 block 的值

c - 通过引用传递二维数组

c++ - 在 Irrlicht 中使用 SDL

c++ - mingw 和 SDL 命令行