手机斜角地图中A*算法的实用化
在这里关于A*算法的基本实现我不多说了,这类文章很多的,大家可以去参考。我目前还是学生主专业是J2EE方向,假如说得不对,还请各位多多包涵。
A*算法在斜角地图中的实现要害在于确定每次移动的基准点,你可以把基准点定得比较细也可以比较粗。大家可以比较下面两幅图。
在我的实现中,我选择了后者,即把基准点定的比较粗,定在每个TILE的中心。原因有两个: 一,明显计算简单,速度会快很多。 二,确定障碍物也比较方便。 前一种方法往往是在对寻路精度要求比较高的情况下使用。 当然两者混合使用也是非常好的,即在大路径上采用粗的寻路点,到了一个目标点TILE上再采用精细的寻路点进行计算。 我目前采用了这样的方法:
如上图所示,寻路的起点和终点并非总是在TILE中心的,假如要使用粗精度的A*来寻路必须使得寻路点在中心上(目前手机键只支持8方向,寻路点在中心也是必须的)。 我们采用这样的办法先计算出A*要经过的每一个TILE,然后使起始点的位置到第二个TILE的中心位置进行修正移动(即不是直接斜方向移动,而是横竖移动),这样我们的寻路点便到中心了,中间过程便可以以一个个TILE为基准进行移动(图中橘黄色的路径),到倒数第二个TILE时再进行一次向目的点的修正移动。这样便可以比较精确地进行移动了。 不要在第一个TILE中即进行修正移动,因为有可能会有这种情况,中心在人的下面,而人的A*算法的趋势是向上移动,会造成人先下移动再向上移动,非常傻。
一些看法:
1 手机中不一定要使用Binary Heap A*算法
关于Binary Heap A*算法,大家有爱好可以看看这个http://www.policyalmanac.org/games/binaryHeaps.htm
它主要是在对于OPEN表进行了优化,但我觉得在手机游戏上不一定要使用,拿我的实现做例子,在180*208的屏幕上,我贴了40个左右的TILE。大家知道一般怪物都是有视力的,能看到1个屏多一点已经很不错了,这样的话OPEN中节点达到40个已经算是很多了(几乎不可能),我们采用二分插入排序完全可以满足性能的要求,无需使用Binary Heap了。(这也是我使用粗精度寻路方法的原因之一:) )