A*嵌入direct

今天做了幾個小時,全屏下的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是相反的,如果這點求錯了,屏幕的走路就和數組檢測不一致了,當然就出項了精靈穿牆的情況。

截個圖:

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

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

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

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

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

最後到達點的目的地~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章