星期四, 五月 24, 2007

XNA GSE入门(四) 输入设备

输入设备的种类
XNA GSE支持三类输入设备,键盘,鼠标和Xbox360的手柄,前两者是在PC上支持的,而后两者在Xbox360上支持。
XNA将输入的内容分为两类,一种是模拟的,输入的内容是有一定数值范围。一种是数字的,只有2种状态,0和1。这并不是说某一个设备就一定是模拟的或者数字的,比如说鼠标,即有数字的输入,比如左右键的状态作为输入;又有模拟的输入,比如滚轮的位置和指针的位置。具体的内容参见XNA文档里面的列表
Input Device
Digital Buttons
Analog Controls
Vibration Effects
Supported on Windows
Supported on Xbox 360
Number Allowed on System
Xbox 360 Controller
14
4
Yes
Yes
Yes
4
Keyboard
> 100
0
No
Yes
Yes
1
Mouse
2
2
No
Yes
No
1
我们可以看到,出了键盘是完全数字的,其他两种都同时包含数字输入和模拟输入。列表中的最后一栏表示支持同时使用设备的数量,手柄可以同时用4个。也就是说,我们最多可以开发4人在同一台机器上操作的游戏。
输入内容的获取XNA的输入部分应该是封装了Direct Input的接口而来的。操作方式和Direct Input的非常类似,通过调用函数查询设备状态时,就是给输入设备拍一次快照,将结果保存在一个结构中,然后游戏根据保存的数据将用户的交互传递给游戏引擎。取得设备状态的静态类主要有Mouse,Keyboard,Gamepad,它们提供访问设备的方法;对应的状态类,保存状态数据和对状态数据做一些基本操作MouseState,KeyboardState,GamepadState。
键盘
KeyboardState类用来保存键盘状态,通过调用Keyboard类的静态函数GetState获得当前键盘状态
例如:KeyboardState currentState = Keyboard.GetState();
测试某个键是否按下currentState .IsKeyDown(Keys.A); 测试某个键是否是松开currentState .IsKeyUp(Keys.A); 取得哪些键是按下的Keys[] keys = currentState ..GetPressedKeys();由于这样一种查询的方式,我们如果要知道这一帧哪个见被按下,就需要做一些额外的工作,而不能像在windows下那么直接去捕获WM_KEYDOWN或者WM_KEYUP,文档中的例子刚好解决了这个问题。

鼠标
和键盘基本一样
例如:MouseState mousestate = Mouse.GetState();
取得鼠标位置 int x = mousestate.X
取得按键状态 ButtonState buttonstate = mousestate. LeftButton;
Xbox360手柄
取得按键状态和键盘鼠标基本一样,具体参见文档。和它们不一样的是,手柄需要可以是否连接上
GamepadState. IsConnected用来表示设备是否连上。不过记住,这个只是一个设备快照,要实时监控手柄是否连上,需要不断调用Gamepad.GetState查询。

没有评论: