Menu

终于把AStar搞定

哈哈,现在我已经把AStar搞定了哈,经过几天的努力,现在的寻路基本没问题了。谢谢老师的帮忙,也谢谢一位新朋友Jonlee的帮忙。哈哈,我已经把他的BLOG设为了友情。

现在要实现动态地图转换,剩下的东西还有很多,单方面的寻路搞定了,还要把Monster结合起来。呵呵,事情有时候没有我想的那样简单,还是自己一步一步的做吧。

呵呵,开发的时间我和同事们建立了一个WOW的私人服务器,哈哈在办公室内玩。昨天又和永存打乒乓,最近他技术进步好大哦。

时间在一天一天的过去,项目的工程也进展的得好快好快。但剩下的时间不多了,我想好好的过一个大年,所以,只有在这之前多忙乎吧。

在AStar中,我大概提供了如下方法:

namespace GamePlay
{
  //地图节点类型枚举

  enum asPointType
  {

    OPEN,    //属于open表
    CLOSE,    //属于close表
    UNKNOWN,  //未知

  };

  //简单坐标结构
  struct asPoint
  {
    int x,y;
  };

  //地图节点结构
  struct asMapNode
  {
    int  px,py;      //父节点坐标
    int x,y;      //坐标
    bool blocked;    //是否是“墙”
    asPointType type;  //节点类型
    int f,g,h;      //总的估价,起点到该点的实际代价,终点到该点的估计代价
    bool step;      //是否是最终路径一部分
  };

  typedef struct AsPath
  {
    int x[256];
    int y[256];
    int step;
  }AsPath;

  /////////////////////////////

  //AStar类的声明
  class AStar
  {
  public:

  public:

    AStar();

    //读取地图
    void SetMap(bool _map[8][8]);

    //显示最终路径
    AsPath GetPath();

    //设置起点
    void SetStartPoint(int x,int y);

    //设置终点
    void SetEndPoint(int x,int y);

    //计算路径
    bool JudgePath(bool _useEightAround/*搜寻8个方向*/);

    //显示最终路径节点
    AsPath ShowPath();

  private:

    //在Open表中查找估价值最小的节点
    asPoint FindBestPath();

    //计算并设置节点估价值
    void SetASEvaluating(int y,int x,int cg,asPoint pr);

    //估价函数
    int GetEvaluatingH(int x,int y);

    //设置周围8个节点的估价值
    void Set_Around(bool _eight = false);

    //地图宽
    int m_iMapWith;

    //地图高
    int m_iMapHeight;

    //起点
    asPoint m_asPStart;

    //终点
    asPoint m_asPEnd;

    //当前节点
    asPoint m_asPCurrent;

    AsPath _t;

    //当前节点需要的步数
    int m_iCurrent_g;

    //当前x坐标
    int m_iCurrent_x;

    //当前y坐标
    int m_iCurrent_y;

    //当前Open表中估价最小的点
    asPoint m_asPBestNode;

    //地图
    asMapNode* m_map[1000];

  };
}

具体的实现等我把整个进行封装后将提供在我的引擎内。

加油吧~~~

Categories:   Garfield's Diary

Comments