HTML5遊戲開發進階 7 :單位智慧移動
向被選中的單位下達命令,並使其執行該命令。將實現最基本的命令:使用自動尋徑導航演算法實現的單位智慧移動。
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次。
相關文章
- HTML5遊戲開發進階 6 :加入單位HTML遊戲開發
- HTML5移動遊戲開發高階程式設計 3:試飛結束,向移動進發HTML遊戲開發程式設計
- HTML5遊戲開發進階 10:完成單人戰役HTML遊戲開發
- HTML5遊戲開發進階 4 :物理引擎整合HTML遊戲開發
- HTML5移動遊戲開發高階程式設計 2:從玩具到遊戲HTML遊戲開發程式設計
- HTML5移動遊戲開發高階程式設計 9:自建Quintus引擎(1)HTML遊戲開發程式設計UI
- HTML5移動遊戲開發高階程式設計 10:自建Quintus引擎(2)HTML遊戲開發程式設計UI
- HTML5移動遊戲開發高階程式設計 11:自建Quintus引擎(3)HTML遊戲開發程式設計UI
- HTML5遊戲開發進階 3 :物理引擎基礎HTML遊戲開發
- HTML5遊戲開發進階 8 :新增更多的遊戲元素HTML遊戲開發
- HTML5遊戲開發進階 9:新增武器和戰鬥HTML遊戲開發
- HTML5遊戲開發進階 12:多人對戰遊戲操作HTML遊戲開發
- HTML5遊戲開發進階 2 :建立基本的遊戲世界HTML遊戲開發
- HTML5遊戲開發進階 11:WebSocket與多人對戰模式HTML遊戲開發Web模式
- HTML5移動遊戲開發高階程式設計 1:先飛後走,先難後易HTML遊戲開發程式設計
- HTML5遊戲開發進階 5 :建立即時戰略遊戲世界HTML遊戲開發
- HTML5 進階系列:canvas 動態圖表HTMLCanvas
- 用REM單位進行移動端適配的最佳實現REM
- 7個HTML5移動開發框架,初學HTML5必看HTML移動開發框架
- 位運算進階
- 移動遊戲開發精要遊戲開發
- 智慧合約語言 Solidity 教程系列7 - 以太單位及時間單位Solid
- HTML5 進階系列:web StorageHTMLWeb
- 遊戲開發之--簡單的人物走動和地圖移動(一)遊戲開發地圖
- HTML5遊戲開發進階指南(亞馬遜5星暢銷書,教你用HTML5和JavaScript構建遊戲!)HTML遊戲開發亞馬遜JavaScript
- 遊戲開發者:過半移動遊戲開發者使用Unity引擎遊戲開發Unity
- 移動web效能優化從入門到進階Web優化
- HTML5進階FileReader的使用HTML
- Three.js 進階之旅:全景漫遊-初階移動相機版JS
- TAGS::Vim進階索引[7]索引
- 【C進階】16、位運算子
- 前端進階系列(三):HTML5新特性前端HTML
- HTML5 進階系列:indexedDB 資料庫HTMLIndex資料庫
- HTML5觸控事件實現移動端簡易進度條HTML事件
- 移動端使用 rem 單位時 css sprites 定位問題REMCSS
- 進階7 正規表示式
- 《Unity移動遊戲開發》讀後感Unity遊戲開發
- 移動遊戲開發的五個技巧遊戲開發