前 20 節奠定可擴展基礎,本節進入「第一部分拓展小結」,重點解決原版 A* 兩大痛點:無障礙仍啟動尋路浪費效能、副本地圖實現不完美。
記錄未碰撞座標 (Old_X, Old_Y),碰撞發生時強制還原座標再啟動 A*。缺點:畫面出現瞬間彈跳,嚴重破壞動畫平滑度。
即時預測主角朝向前方單元格,發現障礙物立即啟動 A*。優點:邏輯正統、畫面平滑、無視覺瑕疵。實現難度稍高但收益最大。
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。下節將完整串聯遊戲迴圈邏輯。