[iphone-game] 介绍 Astar (a*) A星算法在iPhone/iPad 上的应用
本文并不介绍如实去实现a star 算法,也不去介绍什么是a star 算法。
如果这方面不太了解了。去文章的末尾两个链接可以先补习一下。
本文侧重于在游戏中实际应用。
为什么要使用a star 算法:
游戏中,我们常常会遇到一些任务或者是怪物的路径移动问题,尤其是有原本的地图的情况下。比如,任务从A走到B,如果直接过去,中间是有条河的,肯定不行。如果绕过去,两侧没有河,一侧是山,一侧是桥,山不能走,挡路,只有桥。 就算任务从桥过去,如何能保证正确的从桥上通过呢?
于是我们引入了a star 算法,当然他在游戏中也并不只是这一个应用,只是举例如此引出:
我们规定地图,是由一个二维数组组成(当然你说一维也可以),里面仅仅存储类似,0,1,2,3 这样的数据,通常情况下只有0,1。例如0代表不能行走,1代表可行走。 这0,1的二维数组是和一张地图对应起来的。我们尝试着把地图无线小的分割成无数个矩形,或者正方形。例如,将5000x5000的大地图,以每个25像素为宽度和高度,分成200x200的一个二维数组。每个数组里面的0代表无法行走。如果从地图的左上角那50x50的一个小范围,是一颗树来看的话,那么对应的二维数组里面,00,01,10,11 这四个值都是0。以此类推,通过某种图像处理的方式,我们可以生成一个完整的200x200的二维数组。
如何生成这个地图,我并没有什么太好的方式,可以使用一张粗略的颜色图片,2个颜色,大体的花出来路径,例如红色代表可走,其他颜色不可走,和原本彩色地图按位计算得出。我也是猜测。
如何使用a star 算法:
既然我们已经有了一个和地图对应的二维数组,即可通过a star 算法尝试着去寻找某一个数组里面的‘1’,到下一个‘1’,所 花费的最少的cost 的路径了。
下面以实际人物移动为例,具体说名下返回的路径(cocos2d为例):
返回的路径无非就是一些从起始点到重点的坐标集合,集合中的每个元素都是一个人物将要移动的位置。
1。使用库函数ccMoveTo/By等, 依次移动。缺点是移动中断比较难做。
2。使用坐标变化方式,实时刷新人物坐标。维护移动了的节点,没有走的节点。 通过某种圈地函数,判断是否已经走到了制定的坐标位置。
何时使用a star 算法:
何时使用往往是人物的移动是收到一定的限制,在地图中并不是个坐标都可以走的。往往客户端本地和服务器使用的是同一份地图数组,当客户端进行移动的时候,会将移动了的坐标发送到服务器去,如果服务器发现这一组数据是非法的,将会把人物进行拉回。但通常情况下,我们并不采取人物本身的初始移动,由服务器来控制行走。这样是完全不可行的,人物还未走,就需要发送一条移动请求,返回需要走的坐标,很少有人尝试这一种设计。
下面说一种本不应该使用a star 算法的例子,例如某种人物怪物或者其它角色,他的移动通常是一条固定的线路,那么使用a star算法就画蛇添足了。 每次寻路的结果也是一样的,往往耗费了性能。例如人物杀怪,怪物如何移动直接有服务器给出即可。
a star 算法的性能:
这里我倒是没有具体的统计数据,不过就ipad的性能来说,计算2000x2000的地图的时候一般不会出现让人察觉的停顿方式。如果考虑使用开一个新的线程实现,也没有这个必要。从用户体验角度来看,虽然单开的这个线程在计算完成了路径后,人物开始移动,和使用一个线程实现,效果都是一样的,慢的话我们都需要等待。
通常并不建议去使用这样一种地图方式:上下都有大片的可走区域,而中间只留下一条可走的路,从算法本身扩散式的寻找来看,性能是很低下的。 因为别忘了我们使用的是移动的平台。
关于Astar 的理论介绍:
http://www.cnblogs.com/gansaishi2008/articles/1254603.html
http://wenku.baidu.com/view/eaa14f11f18583d049645992.html
作者:Alexliu(alex dotNet Learning)
出处:http://alexliu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,转载请注明。并且保留文章链接。否则保留追究法律责任的权利。