A*嵌入direct

来源:互联网 发布:linux自动补全命令 编辑:程序博客网 时间:2024/05/19 02:42

今天做了几个小时,全屏下的direct,24位位图映射32位,先检查了昨天的算法,似乎有些记录的信息是不需要的,比如说NODE指向的child数组,是没有必要记录的,所以干脆删了它,后来看应该需要一个next指针,因为记录的是father,而精灵如果走,就必须按顺序知道第一个要走的点,所以还要顺序排过来,就像这样:

     result = pathFinder.FindPath(sourcePoint.x,sourcePoint.y,destPoint.x,destPoint.y);    
     
     if((result!=NULL)&&((result->father)!=NULL))
     {
      while(result->father->father)
      {
       result->father->next = result;
       result = result->father;
      }
     } 

得到的result返回的便是第一个要走方格的指针。

然后是模拟的实现,用昨天的方法,刚好矩阵是16行,12列,实际上昨天试验的时候就计算好了,每个方格大小为64x64,,1024X768的分辨率就刚刚好了。由于是先试验嵌入direct,所以我采取的方法是修改昨天的矩阵数组,还是从数组中查询信息,而这边的屏幕刚好每个格子做好对应,不如矩阵是[0][0]是障碍物,我就在屏幕0,0的坐标地方画一个64X64的方格,表示障碍,而矩阵中是空格的地方,这边就以白色表示,寻路时仍然按照数组进行查询。这样我在寻好路之后,得到一个路径的链表,只要把链表中的行值x和列值y分别乘以64,然后赋值给精灵下次要走的点就OK了。

有这两点要注意的:
【1】,昨天的程序有部分是参考网上那个介绍的算法的,但是那个似乎没有考虑过斜角的情况,就是精灵不能穿过corner的问题,看了那个介绍的第二部分(那个外国老的),我加上了这部分处理。
【2】,用矩阵数组和屏幕进行对应检测的时候要注意矩阵的x,y和屏幕的笛卡儿坐标是相反的,比如二维数组的第二行,第三列,在矩阵中,当然x=2,y=3,而在屏幕的笛卡儿坐标上,左上角是0,0,横向向右是X方向扩展增大,纵向向下是Y方向扩展增大,所以这么对应过来到屏幕上(64X64是一个格,可以理解成一个点)应该是x=3,y=2,这和二维数组中的x,y是相反的,如果这点求错了,屏幕的走路就和数组检测不一致了,当然就出项了精灵穿墙的情况。

截个图:

======================================================================

=====================================================================

=====================================================================

======================================================================

=====================================================================

最后到达点的目的地~

原创粉丝点击