1

我正在使用 Cocos2D 制作一个基于网格的休闲 2D iPhone 游戏。网格是一个“交错的”六角形网格,由大小均匀且间隔开的圆盘组成。它看起来像这样

我已将网格存储在二维数组中。我也有一个“环绕”网格单元的概念。即围绕特定单元格的六个网格单元格(边界上的网格单元格可以少于六个)。

无论如何,我正在测试一些碰撞检测,但它并没有像我计划的那样工作。以下是我目前对接近静止圆盘组的移动圆盘进行碰撞检测的方法:

  1. 使用移动单元的 xy 位置计算最接近移动单元的网格单元的 ij 坐标
  2. 使用 ij 坐标获取周围网格单元的列表
  3. 检查周围的细胞。如果它们都是空的,则没有碰撞
  4. 如果我们有一些非空的周围单元格,那么将圆盘中心之间的距离与碰撞所需的某个最小距离进行比较
  5. 如果发生碰撞,则将移动圆盘放在网格单元 ij 中

所以这行得通,但不太好。我考虑过一种可能更简单的蛮力方法,我只是在游戏循环的每个步骤中将移动圆盘与所有静止圆盘进行比较。这在性能方面可能是可行的,因为固定盘数最大为 300。如果不是,那么可以使用一些空间分区数据结构,但是感觉太复杂了。

在这样的游戏中,碰撞检测的一些常见方法和最佳实践是什么?

4

1 回答 1

2

我相信您应该能够将移动圆盘的 xy 坐标准确地映射到最近的单元格。

    +------+-------+-------+ odd rows
    |      |       |       |
    |      |       |       |
+---|--+---|---+---|----+  | 
|   +--|---+---|---+----|--+
|      | x     |        | <- even rows
|   +--|---+---|---+----|--+ odd rows
+---|--+---|-y-+---|----+  |
    |      |       |       |
    |      |       |       |
    +------+-------+-------+

x位于 even_row[0][1] 而点y位于odd_row[1][1] 并同时位于 even_row[0][1]。最多有两个地方,然后一个可以计算出其中哪个最接近。(没有理由将偶数行和奇数行保留在不同的数组中......)

您应该能够推导出将 y 映射到奇数行和偶数行的数学公式。

于 2012-10-19T06:38:40.457 回答