程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> XNA入門教程(二) 移動控制

XNA入門教程(二) 移動控制

編輯:關於.NET

上一章,我們主要介紹了何謂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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved