我正在使用 Flex 和 Flashpunk 框架开发 AS3 游戏。这样做的要求之一是我可能有大量的实体使用 A* 算法移动、碰撞和寻路。
我尝试优化此解决方案的方法之一是让 A* 函数在有限的地图区域中工作,该地图区域由实体周围的可变网格大小组成。实体通过“感应范围”限制定位和路径移动到另一个实体的能力受到限制。
我的想法是,我可以通过仅在需要时搜索一个小区域来避免使用 A* 来解决动态障碍和目标。一旦接收到路径,实体将在检查冲突时移动到第一个节点。如果在途中检测到冲突,实体将等待一两秒,然后重新检查冲突。如果没有找到继续到节点,重新检查,移动到下一个。如果延迟后碰撞仍然存在,这很可能是静态障碍物,应重新计算路径。
我遇到的问题涉及我正在使用的实现以及它如何存储这些网格数据。目前地图被表示为一个长度等于网格区域的数组。我知道这应该被移到排序列表或二进制堆中,但我会保持简单,直到我有一些可以正常工作的东西。
对,所以这是实际的问题:
此网格表示在世界位置 500,500 处的实体的搜索数组。实体精灵尺寸为 64x64。实体表示为网格中心的灰色方块。
每个网格中的第一个数字是数组中的索引,第二个是行和列(这是 A* 函数存储数组的方式),第三个是相对于实体位置的世界坐标。每个网格块代表一个 64x64 的区域。
我正在尝试将网格写入世界坐标函数。我有一个路径数组,其中包含路径中每个节点的行/列,但我需要将其转换为相对世界坐标。请注意,0,0 坐标位于左上角。
我在编写这个函数时做了几次尝试,但没有成功,我的数学很糟糕。如果有人知道如何做到这一点,或者解决这个问题的不同方法,我将不胜感激。