D3D游戏编程系列(三):自己动手编写即时战略游戏之寻路
说起即时战略游戏,不得不提的一个问题是如何把一个物体从一个位置移动到另一个位置,当然,我说的不是瞬移,而是一个移动的过程,那么在这个移动的过程中我们如何来规划路线呢,这就不得不提到寻路了。
我所了解到的寻路算法有很多,当然我还是向大家推荐A*算法,这个应该是目前在八个方向上效率最高的寻路算法了吧,在这里,我不准备详细的去介绍这个算法的原理,给大家一个链接,http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html,这是我在网上看到的我个人认为有关A*算法最好的讲解了。
好了,废话不多说,我给出在4个方向上的算法代码(上下左右,因为我的游戏里就是在四个方向上移动,八个方向类似)。
struct sPathNode;class sort{ public: bool operator () (const sPathNode* b1,const sPathNode* b2) const{ return b1->F<b2->F; } }; struct sPathNode{CPoint Cur;sPathNode *Par;int F;sPathNode(){}sPathNode(int x,int y){Cur.SetPoint(x,y);}};struct sEleObj{IDirect3DTexture9* Sur;CPoint DesPos;CRect CurPos;list<CPoint> VecPath;bool bMove;byte ID;};multiset<sPathNode*,sort> m_OpenListSet;multiset<sPathNode*,sort> m_CloseListSet;
还有我不得不提的是,动态碰撞怎么办,对,就是在你规划路径好了以后,在你的路径上出现了其他物体该怎么解决呢,那么我们就需要去做动态寻路,在我们遇到障碍物后,会根据当前物体的id,决定是否等待,如果等待,则障碍物如果是移动状态,则重新去寻路,规划一条新的路径,如果障碍物已经是停止状态,则当前物体重新寻路,规划出一条新的路径。
最后一点是,当我们操作多个物体移动到同一地点时,因为不可能重叠,所以这些物体不可能到达同一位置,这就是说,当物体的目的地不可到达时,我们该怎么处理呢?其实很简单,就是以目的地为中心向外搜索,找到一个物体可以到达的位置作为新的目的地,然后去寻路这个目的地就可以了。
说起来简单,但是这其中的代码量和繁琐程度还是很大的,大家可以参考一下我上传的代码,有什么问题一起交流下。
本文有不足之处,还望大家多多指正。