在2D六角形网格上检测碰撞



我正在使用COCOS2D制作基于休闲网格的2D iPhone游戏。网格是一个"交错的"六角形的网格,由均匀尺寸和间隔的圆盘组成。看起来像这样。

我已经将网格存储在2D数组中。我也有一个"周围"网格单元的概念。即,围绕特定单元的六个网格单元(边界上的细胞可能少于六个)。

无论如何,我正在测试一些碰撞检测,并且没有像我计划的那样奏效。这是我目前的碰撞检测方式,用于接近固定光盘的移动光盘:

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

所以这有效,但不太好。我已经考虑过一种潜在的简单蛮力方法,在该方法中,我将移动的光盘与游戏循环的每个步骤进行比较。在性能方面,这可能是可行的,因为固定盘数量最大为300。如果不是这样,则可以使用某些空间分区的数据结构,但感觉太复杂了。

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

我相信您应该能够将移动光盘的XY坐标精确映射到最接近的单元格。

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

x 位于even_row [0] [1],而点 y 位于在odd_row [1] [1]上,同时在even_row [0] [1]上。最多有两个地方,然后可以计算哪个是最接近的地方。(没有理由将均匀的行保持在另一个数组中...)

您应该能够得出将y映射到奇数甚至行的数学公式。

相关内容

  • 没有找到相关文章

最新更新