使用XNA访问Xbox 360游戏杆(译文)
By S.F.
本文链接 https://www.kyfws.com/news/using-xna-to-access-an-xbox-360-joystick/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 6 分钟阅读 - 2578 个词 阅读量 0使用XNA访问Xbox 360游戏杆(译文)
原文地址:https://www.codeproject.com/Articles/16983/Using-XNA-to-Access-an-Xbox-360-Joystick
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
本文演示了如何使用Microsoft XNA Framework读取Xbox 360控制器的状态
下载源文件-13.74 KB下载演示项目-216.95 KB
介绍
随着XNA的发布,Microsoft提供了一个在PC和Xbox 360上编写游戏的平台.与受管理的DirectX相比,XNA提供了对硬件的简化访问. XNA框架也完全支持Xbox 360控制器.在本文中,我将使用Visual Studio 2005和XNA Framework创建一个演示表单,该表单将显示连接到系统的Xbox 360控制器的完整状态. 2012年11月11日更新-我发布了另一篇文章,该文章使用XInput而不是Xna来访问相同的功能. XInput可以访问其他信息(例如有关电池的信息),但是其他文章中的代码版本需要Windows8.您可以在[此处]找到该文章(http://www.codeproject.com/Articles/492473/使用XInput访问Xbox-360-Controller-in-M).
先决条件
此代码示例使用XNA Framework中的程序集,您将需要安装XNA可再发行文件才能运行示例程序.您可以从此处下载它.在创建自己的XNA项目时,请记住添加对" Microsoft.Xna.Framework"和" Microsoft.Xna.Framework.Input"的程序集引用.
XNA
XNA Framework基于.NET Compact Framework的子集,并设计为在Windows XP SP2上运行.在撰写本文时,尽管Framework确实可以在这些系统上运行,但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,返回,开始,指点杆下的按钮和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);
“触发器"结构包含成员"左"和"右”,它们具有浮点以表示按下触发器的距离. " ThumbSticks"成员有两个成员" Left"和" Right".其中的每一个都是一个" Vector2",或者是一组浮点X和Y值,它们指示操纵杆的位置.带有(X:0,Y:0)值的"向量"表示操纵杆位于中心位置,(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 Framework大大简化了与Xbox 360控制器的交互.在下一篇文章中,我将展示如何使用XNA和XNA输入设备来控制屏幕上的对象来渲染图形.
历史
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
.NET2.0 WinXP Win2003 VS.NET2003 VS2005 C#2.0 C# Windows .NETCF .NET Visual-Studio Dev Intermediate 新闻 翻译