實作XNA FRAMEWORK中的INPUT操作 (一)

摘要:實作XNA FRAMEWORK中的INPUT操作 (一)

之前,介紹過如何在程式中匯入3D MODEL

但是,如果要調整Model位置的話這樣有點麻煩,可能會要設定3D Model的位置,或是CAMERA的位置(依據個人喜好不同)。

每更改一次,就要重新編譯建置等,太麻煩了,所以這邊就讓我們能夠操控鍵盤滑鼠標準輸入設備吧!!
XBOX360遊戲把手操作部份,由於目前我還沒有特別的接觸,所以不清楚了解。

本篇主要再說的是標準輸入鍵盤與滑鼠的操作。

XNA Frameworl 幫我們準備好很多設定,以及與硬體溝通等那些複雜設定,提供一些方法,只要呼叫他詢問,那些想知道的東西的狀態,XNA Framework會幫你記錄好那些想要的資訊,同時再回報給你的知道。

首先,我們先些個鍵盤的類別吧!

在Solution Expolorer中的專案按下右建,ADD NEW ITEM,選擇CLASS。

這邊可以打上自己喜好的名字,我取名為MyKeyBoard
取好名字以後岸線ENTER,C#會幫你做好初始的樣式,接下來我們把這個初始的設定做一下修改吧
首先,刪除
using System;
using System.Collections.Generic;
using System.Text;
之所以要刪除這些是因為,這三行在我目前的類別中不會使用到,如果你保留這三行,這樣在編譯的時候,會引入一些函式庫,會增加編譯的時間。
再來增加兩行
using System.Collections.ObjectModel; // 使用集合
using Microsoft.Xna.Framework.Input;  //使用XNA FRAMEWORK的INPUT
接下來更改命名空間(NAMESPACE),可以更改成自己喜愛的。

一個遊戲怎麼會跟輸入裝置互動?如何取得輸入資訊?遊戲主要是因為互動性高,所以才受一般使用者喜好,在XNA中,提供GetState這個方法,讓你取得目前鍵盤的狀態,像是有甚麼按鍵被按下了,甚麼按鍵被放開了等資訊。
所以,在MyKeyBoard當中,主要目的就是處理從XNA獲得的資訊了。

這個類別規劃會有以下東西
namespace Game.Input
{
    class MyKeyBoard
    {
       KeyBoardState previousState;
       KeyBoardState newState;
       Collection<Key> previousPressKey; // 集合
       Collection<key> hitKey;
       MyKeyBoard();
       public void Update();  // 更新目前鍵盤資訊
       public bool IsKeyDown(Keys key);  // 檢查是否某鍵被按下
       public bool IsKeyUp(Keys key);  // 檢查是否某鍵被放開
       public bool IsKeyHit(Keys key);  // 檢查是否某鍵被HIT
    }
}


接下來就是實做這個類別的內容了,建構子的部分,將他設定初始建構值
previousState = newState = Keyboard.GetState();  // 取得目前的狀態
previousPressKey = new Collection<Keys>();  // 實作集合實體
hitKeys = new Collection<Keys>();

再來就是Update函數,由於Update這個函數在XNA中是不斷被呼叫的,所以KeyBoard的資訊也需要常常更新才行,在這個類別中也有個Update,是當XNA呼叫XNA主程式的Update時候順便執行,鍵盤的Update。
處理內容為
previousState = newState;   // 將上一個的狀態存起來
newState = Keyboard.GetState();  // 呼叫新的狀態
hitKeys.Clear(); // 清空集合
 foreach (Keys key in previousPressKey)  // 用迴圈讀取previousPressKey內容
{
        if (newState.IsKeyUp(key))  // 檢查新的狀態是否被放開
              hitKeys.Add(key);  // 如果被放開,增加HitKey的集合元素,表示該鍵被按下放開
}
previousPressKey.Clear();  // 清除先前被壓下的集合
 foreach (Keys key in newState.GetPressedKeys())  // 用迴圈讀取newState.GetPressedKeys()的內容
 {
       previousPressKey.Add(key);  // 將讀取的內容,增加到previousPressKey的集合中。
}
以上就是Update所做的事情,想必應該不難了解。

接下來IsKeyDown,用來檢查該鍵,是否被按下
return newState.IsKeyDown(key);
回傳真假值,用XNA所提供的方法來詢問。

IsKeyUp,用來檢查該鍵,是否被按下
return newState.IsKeyUp(key);
回傳真假值,用XNA所提供的方法來詢問。

最後IsKeyHit,這個回傳真假值
內容為
return hitKeys.Contains(key);
判斷hitKeys是否包含該鍵的元素。這個元素在Update的時候就已經決定好。

目前到這邊就是鍵盤的類別設定,滑鼠跟鍵盤設定大同小異。

針對輸入的部分,我預計會分成三篇說明,造成不便的話多多見諒ORZ