HTML5遊戲開發進階 7 :單位智慧移動

CopperDong發表於2018-02-12

    向被選中的單位下達命令,並使其執行該命令。將實現最基本的命令:使用自動尋徑導航演算法實現的單位智慧移動。

7.1 命令單位

    單擊左鍵選中單位,通過單擊右鍵給單位下達命令。

    用右鍵單擊地圖上的一點,就會移動到這個點。

    右鍵單擊一個敵軍單位或建築會攻擊該單位。

    右鍵單擊友方單位會命令選中的單位跟隨並保護該友方單位。

    選中採油車後用右鍵單擊油田會命令採油車移動到油田上,並展開成煉油廠。

    mouse中click()方法

7.2 傳送和接收命令

    game.sendCommand()

    為每個item新增Orders屬性

7.3 執行指令

     為每個需要的單位實現processOrders(),並在遊戲動畫迴圈中為所有的單位呼叫該方法。

7.4 實現飛行器移動

     aircraft.js中processOrders()方法

7.5 路徑規劃

    Dijkstra演算法及其變種A*演算法是兩種最常用的基於圖論的尋徑演算法

    A*演算法額外使用一個啟發式距離變數,因此,它比Dijkstra演算法執行得更快,效率更高。

    程式碼http://devpro.it/javascript_id_137.html中找到最新的程式碼和一個生動的例子。

7.6 定義尋徑格網

    建立二維陣列網格game.currentMapTerrainGrid

    每次新增或移除建築或地形單位時,該陣列都要被重新建立。

    為每個建築定義passableGrid屬性,這樣就可以允許建築的某個部分可通行(比如,星港的下半部分)。

    已經為A*演算法定義好了移動格網

7.7 實現車輛移動

    vehicles物件新增預設的processOrders()方法

    值得注意的是,雖然車輛能夠繞過不可通行的地形,但仍然會與其他車輛重疊在一起。

    解決該問題的一個簡單方案是,將所有車輛所在的網格標記為不可通行。然而,這個過於簡單的方法可能導致地圖上的大面積堵塞,因為車輛經常穿過多個網格。該方案的另一個缺點是,如果試圖同時移動若干車輛穿過一處較窄的通道,第一輛通過的車就會阻塞通道,導致其後的車輛試圖尋找另一條較遠的路徑,或者,在更壞的情況下,認為不存在可行的路徑而放棄。

    較好且可行的解決方案是,實現包含碰撞檢查的導航,在車輛擁堵時改變車輛的移動方向,但仍然儘可能儲存原有的路徑。

7.8 碰撞檢測和導航

    與路徑規劃一樣,導航是一個相當複雜的人工智慧問題。參考論文Steering Behaviors for Autonomous Characters被認為是在遊戲中開發導航機制的基礎和起點。    

    遊戲中導航的實現相當簡單。首先,檢查某行進中的車輛在其路徑上是否會與其他車輛碰撞。如果是,那麼為將要發生碰撞的車輛生成來自碰撞物件的斥力和較小的朝向原先行進方向的拉力。

    接著,我們將這兩個力向量相加來確定車輛接下來的方向以避開碰撞。車輛將一直向新的方向移動,直到不再檢測到任何可能發生的碰撞,此時車輛再回到之前規劃好的路徑上。

    基於將要發生碰撞的車輛間的距離來區分“硬撞擊”和“軟撞擊”。即將發生“軟撞擊”的車輛會一邊繼續移動,一邊調整方向,而即將發生“硬撞擊”的車輛則會停止移動,原地轉向。

    vehicle物件實現預設的checkCollisionsObject()

7.9 將採油車展開為煉油廠

    vehicle.js

7.10 流暢移動

    使動畫看上去更流暢的一個簡單方法就是在動畫迴圈之間對車輛的移動進行插值。計算距離上一次動畫迴圈的時間,並建立一個插值量,該插值量用來決定單位在“動畫迴圈間隔中的”繪製迴圈中的位置。這個小改動將使單位看上去以更高的幀頻運動,即使動畫迴圈實際上每秒才執行10次。


    

相關文章