實作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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值