我正在使用COCOS2D制作基于休闲网格的2D iPhone游戏。网格是一个"交错的"六角形的网格,由均匀尺寸和间隔的圆盘组成。看起来像这样。
我已经将网格存储在2D数组中。我也有一个"周围"网格单元的概念。即,围绕特定单元的六个网格单元(边界上的细胞可能少于六个)。
无论如何,我正在测试一些碰撞检测,并且没有像我计划的那样奏效。这是我目前的碰撞检测方式,用于接近固定光盘的移动光盘:
- 使用移动单元格的Xy-position计算最接近移动单元格的网格单元格的IJ坐标
- 使用IJ坐标列表获取周围的网格单元
- 检查周围细胞。如果它们都空了,则没有碰撞
- 如果我们周围有一些非空细胞,则将圆盘中心之间的距离与碰撞所需的最小距离进行比较
- 如果发生碰撞,则将移动的光盘放在网格单元格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映射到奇数甚至行的数学公式。