首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

WPF/Silverlight 遊戲開發教程 (二十-1):改良型完美 A* 移動模式核心原理與碰撞預測實作

     編輯:關於C語言

前 20 節奠定可擴展基礎,本節進入「第一部分拓展小結」,重點解決原版 A* 兩大痛點:無障礙仍啟動尋路浪費效能、副本地圖實現不完美。

改良型完美 A* 移動模式定義

  1. 移動啟動時不啟動 A*,直接建立兩點直線移動
  2. 即時檢測障礙物碰撞,無碰撞則保持直線至終點
  3. 一旦偵測到障礙物,即時以目的地為終點啟動 A* 繞行

碰撞檢測兩大傳統方案對比

方案一:座標還原法 (不推薦)

記錄未碰撞座標 (Old_X, Old_Y),碰撞發生時強制還原座標再啟動 A*。缺點:畫面出現瞬間彈跳,嚴重破壞動畫平滑度。

方案二:啟發式預測法 (採用)

即時預測主角朝向前方單元格,發現障礙物立即啟動 A*。優點:邏輯正統、畫面平滑、無視覺瑕疵。實現難度稍高但收益最大。

啟發式預測法原理示意圖

WillCollide() 八方向預測核心代碼

private bool WillCollide()
{
    switch ((int)Spirit.Direction)
    {
        case 0: return Matrix[(int)(Spirit.X/GridSize), (int)(Spirit.Y/GridSize)-1] == 0;
        case 1: return Matrix[(int)(Spirit.X/GridSize)+1, (int)(Spirit.Y/GridSize)-1] == 0;
        case 2: return Matrix[(int)(Spirit.X/GridSize)+1, (int)(Spirit.Y/GridSize)] == 0;
        case 3: return Matrix[(int)(Spirit.X/GridSize)+1, (int)(Spirit.Y/GridSize)+1] == 0;
        case 4: return Matrix[(int)(Spirit.X/GridSize), (int)(Spirit.Y/GridSize)+1] == 0;
        case 5: return Matrix[(int)(Spirit.X/GridSize)-1, (int)(Spirit.Y/GridSize)+1] == 0;
        case 6: return Matrix[(int)(Spirit.X/GridSize)-1, (int)(Spirit.Y/GridSize)] == 0;
        case 7: return Matrix[(int)(Spirit.X/GridSize)-1, (int)(Spirit.Y/GridSize)-1] == 0;
        default: return true;
    }
}

直線移動中每幀調用此方法,若回傳 true 則觸發 AStarMoveTo(Destination) 並設 IsAStarMoving=true。下節將完整串聯遊戲迴圈邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved