使用 XNA 访问 Xbox 360 手柄






4.76/5 (17投票s)
本文演示了如何使用 Microsoft XNA Framework 读取 Xbox 360 控制器的状态

引言
随着 XNA 的发布,微软提供了一个用于在 PC 和 Xbox 360 上编写游戏的平台。XNA 提供了比托管 DirectX 更简化的硬件访问方式。Xbox 360 控制器也得到了 XNA 框架的全面支持。在本文中,我将使用 Visual Studio 2005 和 XNA 框架创建一个演示窗体,该窗体将显示连接到系统的 Xbox 360 控制器的完整状态。
更新于 2012 年 11 月 11 日 - 我已经发布了另一篇文章,该文章使用了 XInput 而不是 Xna 来访问相同的功能。XInput 可以访问额外的信息(例如电池信息),但其他文章中的代码版本需要 Windows 8。您可以在此处找到该文章。
必备组件
此代码示例使用了 XNA 框架的程序集,您需要安装 XNA 可再发行组件才能运行示例程序。您可以从此处下载。在创建自己的 XNA 项目时,请记住添加对 Microsoft.Xna.Framework
和 Microsoft.Xna.Framework.Input
的程序集引用。
XNA
XNA 框架基于 .NET Compact Framework 的一个子集,并被设计为在 Windows XP SP2 上运行。在撰写本文时,Windows 2003 和 Vista 尚未得到官方支持,尽管该框架确实可以在这些系统上运行。Xbox 360 具有一个 XNA 游戏加载器,为基于 XNA 的游戏提供运行时环境。
由于 XNA 基于 .NET Compact Framework 的一个子集,因此不支持 Windows Forms 命名空间或网络命名空间。但是,如果您的目标仅是 Windows 平台,则可以使用 System.Windows.Forms
和 System.Net
以及其他需要的命名空间。
输入类型
控制器上的输入是模拟的或数字的。数字输入只有两种状态,表示是否被按下:ButtonState.Pressed
或 ButtonState.Released
。控制器上的数字输入是标记为 A、B、X、Y、LB、RB、Back、Start 的按钮,两个拇指摇杆下方的按钮,以及方向键 (D-Pad)。
模拟输入的状用浮点数表示。控制器上的扳机会返回介于 0.0(未按下扳机)和 1.0(扳机完全按下)之间的值。两个拇指摇杆会为 x 和 y 轴返回介于 -1.0 和 +1.0 之间的值,其中 0 是轴的中心点。
Xbox 360 控制器中心的按钮无法访问。它仅由 Xbox 操作系统使用。
访问控制器
通过 Microsoft.Xna.Framework.Input.GamePad
类访问控制器状态。此类除了从 System.Object
继承的方法外,只有三个方法:GetCapabilities
、GetState
和 SetVibration
。在此演示中,我将仅使用 GetState
和 SetVibration
。这些方法接受 PlayerIndex
值作为第一个参数。这用于指定我们将与之交互的控制器。
GetState
方法返回一个 GamePadState
结构。GamePadState
包含控制器状态的几个子结构,名为 Buttons
、DPad
、IsConnected
、ThumbSticks
和 Triggers
。Button
和 DPad
结构具有对应控制器上的 10 个按钮以及 DPad
上的四个方向的成员,这些成员都将设置为 ButtonState.Pressed
和 ButtonState.Released
(在 System.Windows.Forms
命名空间中也有一个枚举,如果您将 System.Windows.Forms
与 Microsoft.Xna.Framework.Input
一起使用,可能需要区分这两者)。
//Setting or clearing a checkbox depending on the state of a button on the controller.
this.gamePadState = GamePad.GetState(this.playerIndex);
this.buttonA.Checked = (this.gamePadState.Buttons.A == Input.ButtonState.Pressed);
Triggers
结构包含 Left
和 Right
成员,它们使用浮点数表示扳机按下的深度。
ThumbSticks
成员有两个子成员 Left
和 Right
。每个子成员都是一个 Vector2
,即一组表示摇杆位置的浮点 X 和 Y 值。值为 (X:0,Y:0) 的 Vector
表示摇杆处于中心位置,(X:-1,Y:0) 表示摇杆处于最左侧位置,(X:0, Y:1) 表示控制器向上推,依此类推。请注意,您永远不会同时看到 X 和 Y 值处于最极端的状态。
两个震动马达
Xbox 360 控制器有两个震动马达。左侧马达产生慢速震动。右侧马达产生快速震动。可以使用 SetVibration
方法开启马达。此方法接受一个 PlayerIndex
和两个介于 0.0f 和 1.0f 之间的浮点数,以指示每个马达的震动强度。
//Turning the slow vibration motor on to 50% maximum
GamePad.SetVibration(playerIndex, 0.5f, 0.0f);
关于程序
示例程序以设定的时间间隔持续轮询 Xbox 360 控制器,并更新屏幕上的状态。复选框用于数字输入。模拟输入用进度条表示。拇指摇杆的轴在最负位置时为空,在中心位置时为一半满,在最正位置时为满。
您还可以使用 UI 底部的数字上下输入框来开启马达。我仅允许马达在有限时间内开启,并在程序终止时将其关闭。
结论
您会发现 XNA 框架极大地简化了与 Xbox 360 控制器的交互。在我的下一篇文章中,我将展示如何使用 XNA 渲染图形,以及如何使用 XNA 输入设备来控制屏幕上的对象。
历史
- 2006 年 12 月 20 日 - 文章创建