2D六边形网格上的碰撞检测

时间:2012-10-19 06:11:22

标签: collision-detection hexagonal-tiles

我正在使用Cocos2D制作一款基于网格的休闲2D iPhone游戏。网格是“交错的”六边形网格,由均匀尺寸和间隔的圆盘组成。它看起来像this

我已将网格存储在2D数组中。我还有一个“周围”网格单元的概念。即围绕特定单元格的六个网格单元(除了边界上可能少于六个的单元格)。

无论如何,我正在测试一些碰撞检测,但它没有按照我的计划进行。以下是我目前对接近固定光盘组的移动光盘进行碰撞检测的方法:

  1. 使用移动单元格的xy-position
  2. 计算最靠近移动单元格的网格单元的ij坐标
  3. 使用ij-coordinates
  4. 获取周围网格单元的列表
  5. 检查周围的细胞。如果它们都是空的那么没有碰撞
  6. 如果我们有一些非空的周围单元格,那么将光盘中心之间的距离与碰撞所需的最小距离进行比较
  7. 如果发生碰撞,请将移动光盘放入网格单元格ij
  8. 所以这可行但不太好。我已经考虑过一种可能更简单的蛮力方法,我只是在游戏循环的每一步中将移动盘与所有固定盘进行比较。这在性能方面可能是可行的,因为固定盘数最多为300。如果没有,则可以使用一些空间分区数据结构,但感觉过于复杂。

    在这样的游戏中,碰撞检测有哪些常见方法和最佳做法?

1 个答案:

答案 0 :(得分: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映射到奇数行甚至行的数学公式。