[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 

posted @ 2010-10-25 14:17 AlexLiu 阅读(...) 评论(...) 编辑 收藏