快速,准确的二维碰撞


17

我正在研究2d自上而下的射击游戏,现在需要超越基本的矩形边界框碰撞系统。

我有很多不同类型的精灵,它们都有不同的形状和大小。精灵的纹理都是具有透明背景的正方形png文件,因此,我还需要一种方法,仅当播放器进入纹理的彩色部分时才发生碰撞,而不是透明背景。

我计划按以下方式处理碰撞:

  1. 检查精灵是否在播放器范围内
  2. 进行矩形边界框碰撞测试
  3. 进行准确的碰撞(需要帮助时)

我不介意先进的技术,因为我想在考虑所有需求的情况下做到这一点,但是我不确定该如何处理。尝试什么技术甚至库。我知道我可能需要创建并存储某种形状,以精确表示每个精灵减去透明背景。

我已经读过每个像素很慢,所以鉴于我的物体水平和数量很大,我认为这不合适。我也看过Box2d,但找不到太多的文档,也没有找到有关如何使用SFML进行安装和运行的任何示例。

Answers:


18
  1. 第一步,创建一个网格并为每个移动的对象更新它。
  2. 仅检查相同正方形中对象之间的碰撞。
  3. 检查对象的边界框是否相交(包含矩形)。
  4. 使用轮廓的低分辨率版本检查像素完美碰撞(请参阅游戏物理)。
  5. 按照游戏物理(Q 2)中所述对轮廓跟踪进行常规检查

步骤1:

创建一个网格二维数组。每个对象都知道它在x,y位置及其宽度和高度上所占据的正方形。如果将某个对象移开,它将从旧方块中清除并更新它正在占用的新方块。

对于n个对象,总共只需要O(n)。对于任何特定对象O(1)。

第2步:

运行所有检查以检查同一正方形中对象之间的碰撞。无需针对不同正方形的对象之间的碰撞运行测试。如果对象具有平均大小,则最多可以占据四个正方形。这意味着很少的检查。

第三步:

检查对象矩形之间的交点。如果不存在交叉点,请停止。

步骤4:

仅在相交区域内检查对象轮廓之间的像素完美碰撞。它应该足够快。如果不是,请创建一个分辨率较低的2d布尔数组,然后首先对其进行检查,如果在此处发现冲突,则只需检查高分辨率2d数组中的一小段即可,从而节省了宝贵的时间。

请阅读以下内容,了解有关如何将游戏世界划分为正方形网格的概念:

制作高效的碰撞检测系统

请阅读本文以了解如何检测像素完美碰撞。

游戏物理/ 2D碰撞检测AS3

您可以显着提高性能:

  1. 保存轮廓的低分辨率(1/16)版本以首先进行检查。

  2. 仅检查两个矩形相交的区域。

  3. 通过将轮廓粗略地划分为多个段,然后仅检查段之间的碰撞。

请欢迎发表评论,我会详细说明。

检查交叉路口区域


1
如Arthur所述,将您的步骤1.和2.替换为网格,并且为了进行准确的碰撞检测,您可以使用低分辨率版本的图像。
Markus von Broady,2012年

1
而且,如果您确实需要,也可以在此处使用类似的技术来回答我的问题:gamedev.stackexchange.com/questions/38481/…–
Markus von Broady

马库斯指出了一个好主意。您应该使用2d布尔数组或视为2d的1d数组,并且可以保存该数组的1/2 1/4 1/8低分辨率版本以加快处理速度。由于对2d布尔数组的计算非常快,因此这可能不是必需的。它仍然是一个有用的工具。
wolfdawn 2012年

如果播放器完全包含在网格的一个正方形内,则只能检查该正方形中的对象。玩家可能一次处于四个相邻的方块中。你是这个意思吗?如果是指矩形之间的交集,是的,则仅需要检查碰撞是否相交即可。
wolfdawn 2012年

1
我希望该更新有助于清除问题。编写了一些代码后,您可以将其发布在代码审查中,并链接我们以获取评论。codereview.stackexchange.com
wolfdawn,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.