小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man
继续上一篇地图上的处理,不过和本篇相比,我们之前的四篇,可都算是“热身准备”了,因为我们要研究一个算法并把它加入到我们的游戏中,这种算法在rpg,以及现在比较火爆的“乱斗”类(参考战斗之心battle heart)中都是比较多地被采用了。
下面我们就介绍一下A星算法,他就是一种启发性的算法,根据现在到达这个位置的步数及之后的“估计步数”,即f=g+h,f是整个从起点到终点的代价,g是从起点到我们目前位置的步数,h是从目前位置到终点的估计值,注意这里是估计值,所以我们得到解并不一定是最好的解,具体解“好”到什么程度呢?就是要根据h的估计的好坏,因此只是一个较优解。(以上的部分只能说是我对A星算法较为浅的理解,只能算是初探吧,有不足之处欢迎指正,这里只是为了更好的解释我的程序。)
我的程序的流程可以分为如下几步,有一个open表,有一个close表,open表首先存储我们的起点,然后由此出发,首先把起点放入close列表,并检测这点周围点的f值(g+h,h我们通过本点到终点的横纵索引差估计而来),把剩下的点放入open列表中,并根据f值进行堆排序,然后把f值最小的点放入close列表中,然后继续上面的循环,继续处理,直到找到终点为止。当然我们还要根据我们的游戏做一些处理即是处理地图中的碰撞等,我们要让我们的人物绕过碰撞。
首先看一下我们的程序结构
首先我们的MapScene得到了保留,然后Astar是A星算法的核心算法类,Astaritem是A星列表中的列表项,首先看Astaritem。
我们为了让此类更好的和cocos2d-x结合,也使用同样的内存管理机制,我们让此类继承与CCNode类,而其中有六个变量,分别是行列,g函数,h函数,f函数,和在堆排序中的父节点。我们采取set/get的方法来管理这六个值
如有错误之处,希望大家多多指正
下一篇继续A星算法游戏实例