上一章,我們主要介紹了何謂XNA
並且做了第一個XNA HelloWorld
本文,將緊接著上文. 繼續我們的XNA之旅.
上篇的最後,我們通過
MouseState ms=Mouse.GetState();//獲得鼠標相關信息
獲得了鼠標的Point位置,讓自己的圖像顯示在鼠標的位置,因此做到了自定義 光標的功能.
現在,我們對XNA的控制器作全面闡述
XNA的控制器
在XNA的控制器,主要定義在 Microsoft.Xna.Framework.Input下,
分為以下幾種
Mouse 鼠標
Keyboard 鍵盤
GamePad 手柄
在默認模板建立的HelloWorld中,我們會發現
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
這其實就是判斷如果按下了游戲手柄的Back按鈕時,自動退出。
同樣,我們可以通過以上Input的相關state來獲得相關輸入端的操作,如按 鈕,位置等等。
一個簡單的例子
現在,我們嘗試在界面中繪制一個簡單的 sprite(精靈),並實現鼠標和 鍵盤的同時控制
protected override void Update(GameTime gameTime)
{
KeyboardState state = Keyboard.GetState ();
if (state.IsKeyDown(Keys.Up))
{
this.Position.Y -= 10;
}
if (state.IsKeyDown(Keys.Down))
{
this.Position.Y +=10;
}
if (state.IsKeyDown(Keys.Left))
{
this.Position.X -= 10;
}
if (state.IsKeyDown(Keys.Right))
{
this.Position.X += 10;
}
base.Update(gameTime);
}
通過以上代碼,我們實現了對鍵盤的簡單監聽。
這樣,當我們按下鍵盤上下左右後,我們的sprite就隨之移動了。
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear (Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(img, new Rectangle ((int)Position.X,(int) Position.Y, 50, 80), Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
如何操作鼠標呢?
根據上面相似的邏輯,我們當然能得到鼠標的當前位置,但是,如果這樣做 ,我們的sprite會直接從原先點瞬間移動到目標點,而沒有中間的過渡過程。
在正常的游戲中,以上邏輯往往比較復雜,中間充滿著障礙物,怪物等。因 此不可簡單的通過point操作。
為了未來的可擴展性,這裡我們最終使用a-star算法來處理這個問題。
至於何謂a-star,請關注這裡
這裡,我們使用了Franco, Gustavo 寫的a-star類庫,來算出最短路徑。
當然,我們這裡的構建的障礙的空的。未來在真實的地圖中,我們需要構建 出相關的障礙。
首先,我們構建一個空的無障礙的點集用作描繪障礙
private byte[,] m_matrix;
m_matrix = new byte[1024,1024];
// FIXME: in matrix ,the obstacle is 0 else is 1
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;
}
}
這裡,如果有障礙則為0否則為1
//在update中加入鼠標位置的最短路徑計算
MouseState state1 = Mouse.GetState();
if (state1.LeftButton == ButtonState.Pressed)
{
IPathFinder pathFinder = new PathFinderFast(m_matrix);
pathFinder.Formula = HeuristicFormula.Manhattan;
pathFinder.SearchLimit = 2000;
m_path = pathFinder.FindPath(new Vector2((int)this.Position.X, (int)this.Position.Y), new Vector2 (state1.X , state1.Y ));
}
if (this.m_path != null && this.m_path.Count() != 0)
{
int index = this.m_path.Count() - 1;
this.Position = new Vector2 (this.m_path[index].X, this.m_path[index].Y);
this.m_path.RemoveAt(index);
return;
}
以上代碼,我們先獲得了當前鼠標的位置,並計算出當前點到目標點的最短 路徑。
之後將其存儲,這樣,如果沒有動作我們每次循環便可自動繼續進行相關的 自動移動了。
通過以上代碼,我們實現了用鼠標或鍵盤的簡單控制。
但是
或許大家發現了,這裡的sprite是單幀的移動並非動畫,如何讓人物運動起 來?請關注下回分解。
源文件下載: http://files.cnblogs.com/edwin1986/WindowsGame2.rar