跳至內容

使用 XNA 建立遊戲/基礎知識/輸入裝置

來自華夏公益教科書

輸入裝置

[編輯 | 編輯原始碼]

輸入裝置是遊戲建立手冊中最重要的章節之一。電腦(或 Xbox)遊戲依賴於與使用者的互動 - 這就是為什麼需要一種方法來檢查使用者輸入並讓遊戲對該輸入做出反應。

XNA 使得控制使用者裝置變得非常容易。它提供了一個易於使用和理解的 API 來訪問滑鼠、鍵盤和遊戲手柄。使用它,可以在短時間內編寫使用者互動方案。基本上,XNA 提供了對以下內容的輕鬆訪問:

  • 滑鼠
  • 鍵盤
  • 遊戲手柄

所有控制器型別的基本概念都是相同的。XNA 提供了一組靜態類(每種型別一個),這些類可用於檢索輸入裝置的狀態和所有屬性(例如,按下按鈕、移動等)。

這種檢測通常位於遊戲迴圈的 Update()-方法中,以儘可能頻繁地檢索狀態。將所有輸入裝置的狀態儲存在類變數中,允許在其他方法和類中檢查狀態。在一個類中有一個布林型變數陣列來表示所有控制器的狀態,即控制器上按下的按鈕、滑鼠移動和點選以及鍵盤上按下的鍵,這是一個常見的解決方案。

protected override void Update(GameTime gameTime)
{
    KeyboardState kbState = Keyboard.GetState();
    // ...
}

Windows 與 Xbox

[編輯 | 編輯原始碼]

Windows 和 Xbox 遊戲通常以不同的方式進行。通常,Windows 電腦由滑鼠和鍵盤控制,而 Xbox 通常由遊戲手柄控制。因此,需要一個控制結構來確定程式碼是在 Windows 上還是 Xbox 上執行,以便為遊戲設定預設控制器。

#if XBOX
// this code is embedded only in xbox project
#endif

但也可以將滑鼠或鍵盤連線到 Xbox,也可以將 Xbox 控制器連線到 Windows 電腦。因此,在大多數情況下,最好檢查例如是否有遊戲手柄連線。處理這個問題的另一種方法是將使用者選擇的控制器儲存在一個變數中。因此,使用者可以決定使用哪個控制器來玩您的遊戲。

無線滑鼠

首先,您必須透過呼叫 Mouse 類的靜態 GetState()-方法來獲取滑鼠狀態的例項。現在,這個物件可以讓您訪問連線滑鼠的許多公共屬性。

MouseState mouse = Mouse.GetState();
bool leftButton = (mouse.LeftButton == ButtonState.Pressed); // left mouse button
bool middleButton = (mouse.MiddleButton == ButtonState.Pressed); // middle mouse button
bool rightButton = (mouse.RightButton == ButtonState.Pressed); // right mouse button
int x = mouse.X; // horizontal mouse position
int y = mouse.Y; // vertical mouse position
int scroll = mouse.ScrollWheelValue; // scroll wheel value

透過屬性“xxxButton”(其中 xxx 代表型別 - 左、中、右)讀取滑鼠按鈕的狀態。如果將此值與 ButtonState.Pressed 或 ButtonState.Released 進行比較,您就可以檢索此按鈕的狀態。在上面的示例中,它將每個按鈕的狀態儲存在一個布林型變數中,如果關聯的按鈕被按下,該變數為 true。

螢幕上的滑鼠位置儲存在滑鼠物件的 X 和 Y 屬性中。此值始終為正(因為它從左上角的 0,0 開始),並且可以與其他滑鼠位置(在遊戲邏輯中)進行比較以檢測滑鼠的特定移動。一個簡單的示例是:

MouseState mouse = Mouse.GetState();
int x = mouse.X;
int y = mouse.Y;
deltaX = oldX - x; // difference of horizontal positions
deltaY = oldY - y; // difference of vertical positions
oldX = x;
oldY = y;

大多數現代滑鼠還具有滾輪,該滾輪通常用於遊戲,例如縮放、滾動或在不同武器之間切換。ScrollWheelValue 屬性是一個整數,代表滑鼠的滾動狀態。

要識別滾輪的移動,有必要儲存一些舊值並將它們相互比較。該差異的符號指示滾動方向,絕對值指示滾動速度。

櫻桃鍵盤

檢查鍵盤上按鍵的狀態非常簡單。首先,您必須透過從 Keyboard 類呼叫靜態方法 GetState 來獲取 KeyboardState 物件。現在,此例項可以讓您檢索特定按鍵的狀態。

KeyboardState keyboard = Keyboard.GetState();
bool keyB = keyboard.IsKeyDown(Keys.B); // key "B" on keyboard
bool keyArrowLeft = keyboard.IsKeyDown(Keys.Left); // arrow left on keyboard

布林型變數 keyB 和 keyArrowLeft 現在儲存“true”(如果特定按鍵當前被按下)或“false”(如果它沒有被按下)。此方法可以重複用於應用程式或遊戲中感興趣的每個按鍵。

還可以直接獲取當前按下鍵盤上所有按鍵的陣列。呼叫 GetPressedKeys 方法將返回一個 Keys 陣列,可以逐個鍵進行遍歷。

KeyboardState keyboard = Keyboard.GetState();
Keys[] keys = keyboard.GetPressedKeys(); // array of keys

遊戲手柄

[編輯 | 編輯原始碼]

遊戲手柄是在 Xbox 上玩遊戲的最便捷方式。儘管 XNA 被設計用來開發 Windows 和 Xbox 遊戲,但預設 API 只支援原始 Xbox 控制器。基於這個事實,您必須決定是強制您的使用者使用(可能還要購買)Xbox 遊戲手柄,還是想支援其他遊戲手柄(例如來自羅技)。

這對於使用者來說可能更舒適,但對於開發人員來說意味著更多的編碼工作。在本章中,我想描述 Xbox 控制器和所有其他控制器的實現方法。

Xbox 遊戲手柄

[編輯 | 編輯原始碼]
Xbox 360 無線控制器

訪問此輸入裝置幾乎與檢查滑鼠或鍵盤的狀態一樣容易。一個(重要的)區別是,XNA 使得能夠將多達四個不同的遊戲手柄連線到 Xbox 或 Windows 電腦。

因此,有必要(通常)在一個迴圈中遍歷連線的所有遊戲手柄,以分別檢查它們的狀態。以下段落將解釋如何執行此操作(以及更多操作)。

GamePadState[] gamePad = new GamePadState[4];
for(int i = 0; i < 4; i++) { // loop over up to 4 gamepads
    gamePad[i] = GamePad.GetState(i); // get state of gamepad
    if(gamePad[i].IsConnected) {
        // gamepad is connected
    }
}

在此迴圈中,您可以訪問所有屬性,例如按鈕(正面和肩部)、數字板和兩個模擬搖桿。以下是操作方法:

bool aButton = (gamePad[0].Buttons.A == ButtonState.Pressed); // button A
bool leftDigital = (gamePad[0].DPad.Right == ButtonState.Pressed); // left button on digital pad
int leftStick = gamePad[0].ThumbSticks.Left.X; // horizontal position of left stick

震動效果可以讓遊戲手柄振動,併為玩家提供對其在遊戲中的行動的特殊反饋。例如,在射擊遊戲中被對手擊中或在賽車遊戲中發生碰撞可能會導致這種反饋。第二個和第三個引數控制震動效果的強度。

GamePad.SetVibration(int controllerNr, float leftRumble, float rightRumble); // make the controller rumble

其他遊戲手柄

[編輯 | 編輯原始碼]
微軟 Sidewinder 遊戲手柄

XNA 不支援原始 Xbox 控制器以外的其他遊戲手柄。但是,可以使用一個名為 SlimDX 的免費庫來整合對它們的 support。

此外,您還需要一個可以在 這裡 找到的幫助程式類 - 它使用 SlimDX 來檢查不是原始 Xbox 控制器控制器的遊戲手柄狀態。

如果您已下載、安裝和集成了 SlimDX 庫和幫助程式類,則可以使用以下程式碼檢查遊戲手柄狀態 - 就像您在 XNA 中對 Xbox 控制器所做的那樣。

controller = new GameController(this, 0); // number of gamepad
GameControllerState state = controller.GetState();
bool button1 = state.GetButtons()[1]; // button 1 pressed
Xbox 360 Kinect 獨立版

Kinect 是 Xbox 的革命性影片攝像頭,可以識別您在電視機前方的動作。這可以用於僅使用您的身體來控制遊戲。開發人員可以使用 Kinect 框架將其整合到他們的遊戲中。

華夏公益教科書