在地圖中,經過鼠標或者由程序自動運行,讓一我的物自動從地圖的一點走到另外一點。須要計算兩點之間的最優路線,要實現這樣的尋路算法。最常規和最簡單的方法,使用A*算法。本篇總結不具體講解A*算法的實現以及原理,主要告訴怎麼用。後面的總結中我會陸續把A*算法進行詳細分析,但願你們學習。算法
1)在尋路過程當中,地圖是被分爲若干個小格子,固然,根據格子數量的不一樣,路線長度的不一樣,計算尋路的時間也就不一樣。數組
|
上面是有一個由20*20的地圖拼起來的地圖,每個地圖塊是有20像素*20像素元件作成。學習 每個地圖塊是2幀構成,地圖幀是人物能夠行走的路線,第二幀是障礙物(桌子)。上面的地圖是路線和障礙物8比2的機率生成,參考代碼:this |
Block 是地圖塊元件類。用Flash cs3 已經作好。對象 this.mass_x_count 是指地圖X軸上板塊數量事件 this.mass_y_count 是指地圖Y軸上板塊數量開發 distancex 是指地圖X軸離邊界Left的距離it distancey 是指地圖Y軸離邊界Top的距離table aNodeMap 是一個2維數組,記錄着每個地圖塊當前的狀態,是障礙物仍是路線。ast
|
地圖初始化中,根據兩個For循環嵌套,生成一個表格狀的地圖。這裏我不在詳細介紹,詳細會AS3的必定能夠看的懂。 |
1)路線尋路確定要有一個元件在地圖上移動,才能夠正確的顯示出尋路的過程。不管是一我的物移動或多我的物移動,基本作法相同,下面咱們就來加載一我的物物件到地圖上來。
Waiter 是一個移動的任務元件。在這裏咱們叫「服務員元件」 Timer 是爲服務員增長一個timer事件,主要目的是爲了服務員從一個地圖塊移動到另外一個地圖塊,不是跳過去的,而是慢慢的移動過去的。 |
此方法主要在加載完地圖後調用,指定人物加載的X,Y座標,進行加載。 |
1)地圖和服務員加載完成後,咱們須要選擇服務員移動的目的地,選擇的方式有不少。舉個例子,人人餐廳中客人進來就餐,首先進門後,程序會自動尋找有空位的X,Y座標,而後計算路線,客人就會沿着路線走進去。一樣服務員也會根據客人進來餐廳的循序,以及客人所作的座椅的座標進行計算路線,而後走過去服務。
2)因爲咱們只是一個例子,因此就有咱們鼠標肯定目的地。
|
this.addEventListener(MouseEvent.CLICK,clickWay); 這個事件經過,用戶鼠標點擊地圖上路線進行調用。 |
|
1)在地圖增長完後咱們增長一個A*算法實例
AStar是A*算法的一個封裝類。咱們須要把咱們地圖上路線和障礙物二維數組傳遞給算法。 |
這個是在地圖加載後完成 |
2)肯定移動目的地後計算路線
上面代碼是在選擇目的地後補充的代碼 |
設置A*(asrar)算法的其實點和目的地。起始點和目的地封裝成ANode對象給算法的。 |
ANode 是一個算法計算中節點的保存,記錄着節點的位置X,Y,節點ID,以及使用曼哈頓方法計算F = G + H F、G、H值的保存。從而作爲路線計算中開啓列表進行存儲。 |
最後會調用DoSearch 判斷路線的獲取是否成功。獲取的路線調用astar.aPath 方法進行獲取。 |
啓動timer 進行服務員移動操做。 |
3)服務員移動
在移動服務以前,咱們肯定,咱們尋找到路線,此服務員的上一個路線已經完成。
代碼以下:
這個方法是在尋找到路線後,timer啓動執行的。bMove 表示是否移動服務員。 player 表明當前移動中的服務員對象,他是在建立服務員的時候保存在全局變量中。 |