【问题标题】:Collision detection on a 2D hexagonal grid二维六边形网格上的碰撞检测
【发布时间】:2012-10-19 06:11:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: collision-detection hexagonal-tiles


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我确实做到了。这发生在碰撞检测算法的早期,作为获取周围单元列表之前的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多