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

XNA 入門教學 (二):鍵盤、滑鼠與 A* 尋路移動控制

     編輯:關於.NET

延續第一章的 Hello World,本章實作 Sprite 的鍵盤/滑鼠雙模式控制,並引入 A* 演算法處理滑鼠點擊的路徑尋找。

XNA 三大輸入裝置

  • Keyboard:Keyboard.GetState() 取得按鍵狀態。
  • Mouse:Mouse.GetState() 取得座標與按鍵。
  • GamePad:GamePad.GetState(PlayerIndex.One) 處理手柄(預設範本用 Back 鍵離開)。

鍵盤移動實作

protected override void Update(GameTime gameTime)
{
    KeyboardState state = Keyboard.GetState();
    if (state.IsKeyDown(Keys.Up))    Position.Y -= 10;
    if (state.IsKeyDown(Keys.Down))  Position.Y += 10;
    if (state.IsKeyDown(Keys.Left))  Position.X -= 10;
    if (state.IsKeyDown(Keys.Right)) Position.X += 10;
    base.Update(gameTime);
}

滑鼠點擊移動:為何需要 A*

直接將 Position 設為滑鼠座標會瞬間傳送,缺乏過渡。真實遊戲地圖含障礙物,需尋路。本範例使用 Franco, Gustavo 的 A* 函式庫 (PathFinderFast)。

建立空白地圖矩陣 (1=可通行, 0=障礙)

byte[,] m_matrix = new byte[1024, 1024];
for (int y = 0; y < m_matrix.GetUpperBound(1); y++)
    for (int x = 0; x < m_matrix.GetUpperBound(0); x++)
        m_matrix[x, y] = 1;

滑鼠左鍵觸發尋路

MouseState ms = Mouse.GetState();
if (ms.LeftButton == ButtonState.Pressed)
{
    var finder = new PathFinderFast(m_matrix);
    finder.Formula = HeuristicFormula.Manhattan;
    finder.SearchLimit = 2000;
    m_path = finder.FindPath(
        new Vector2((int)Position.X, (int)Position.Y),
        new Vector2(ms.X, ms.Y));
}

if (m_path != null && m_path.Count > 0)
{
    int idx = m_path.Count - 1;
    Position = new Vector2(m_path[idx].X, m_path[idx].Y);
    m_path.RemoveAt(idx);
    return; // 本幀只移動一步
}

繪製

spriteBatch.Draw(img, new Rectangle((int)Position.X, (int)Position.Y, 50, 80), Color.White);

已知限制與下一步

  • 目前 Sprite 為單一靜態圖片,移動時無動畫效果。
  • 地圖矩陣為硬編碼空白,實際專案需從關卡資料載入障礙資訊。
  • 下一章將實作逐幀動畫,讓角色「動」起來。

原始碼下載:WindowsGame2.rar

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