如何在C#应用程序中使用xbox one控制器
在C#中已经有大量关于使用xbox 360控制器的信息,但我没有找到xbox one控制器的信息 我需要非常基本的操作,特别是操纵杆和触发值 <> P>在线信息大部分是C++应用程序,但我不想尝试编写自定义库,我想使用类似的东西。我如何在我的应用程序中使用它如何在C#应用程序中使用xbox one控制器,c#,sharpdx,C#,Sharpdx,在C#中已经有大量关于使用xbox 360控制器的信息,但我没有找到xbox one控制器的信息 我需要非常基本的操作,特别是操纵杆和触发值 P>在线信息大部分是C++应用程序,但我不想尝试编写自定义库,我想使用类似的东西。我如何在我的应用程序中使用它 注意:我发布此消息是为了分享我发现的信息,并为自己记录我的发现。不过,我很想听听其他将控制器输入到.NET应用程序的方法。我发现最简单的入门方法是使用SharpDX。从: SharpDX是DirectX API的开源托管.NET包装器 ,所以在
注意:我发布此消息是为了分享我发现的信息,并为自己记录我的发现。不过,我很想听听其他将控制器输入到.NET应用程序的方法。我发现最简单的入门方法是使用SharpDX。从: SharpDX是DirectX API的开源托管.NET包装器 ,所以在Visual Studio中开始使用它非常简单 要开始,请转到Visual Studio内部的
Tools->NuGet Package Manager->Package Manager控制台
(我使用的是2015社区版)
然后只需在Visual Studio底部的Package Manager控制台中键入:安装软件包SharpDX
Visual Studio随后将下载并将其添加到您的解决方案中。现在进入代码
由于我需要xbox控制器的输入,我们只需要添加:使用SharpDX.xin将
放在程序顶部
获取所有值的代码非常简单:
class XInputController
{
Controller controller;
Gamepad gamepad;
public bool connected = false;
public int deadband = 2500;
public Point leftThumb, rightThumb = new Point(0,0);
public float leftTrigger, rightTrigger;
public XInputController()
{
controller = new Controller(UserIndex.One);
connected = controller.IsConnected;
}
// Call this method to update all class values
public void Update()
{
if(!connected)
return;
gamepad = controller.GetState().Gamepad;
leftThumb.x = (Math.Abs((float)gamepad.LeftThumbX ) < deadband) ? 0 : (float)gamepad.LeftThumbX / short.MinValue * -100;
leftThumb.y = (Math.Abs((float)gamepad.LeftThumbY ) < deadband) ? 0 : (float)gamepad.LeftThumbY / short.MaxValue * 100;
rightThumb.y = (Math.Abs((float)gamepad.RightThumbX) < deadband) ? 0 : (float)gamepad.RightThumbX / short.MaxValue * 100;
rightThumb.x = (Math.Abs((float)gamepad.RightThumbY) < deadband) ? 0 : (float)gamepad.RightThumbY / short.MaxValue * 100;
leftTrigger = gamepad.LeftTrigger;
rightTrigger = gamepad.RightTrigger;
}
}
类控制器
{
控制器;
游戏板游戏板;
公共布尔连接=假;
公共int死区=2500;
公共点leftThumb,rightThumb=新点(0,0);
公共浮动leftTrigger、rightTrigger;
公共财务总监()
{
控制器=新控制器(UserIndex.One);
已连接=控制器已断开连接;
}
//调用此方法以更新所有类值
公共无效更新()
{
如果(!已连接)
返回;
gamepad=controller.GetState().gamepad;
leftThumb.x=(Math.Abs((float)gamepad.LeftThumbX)<死区)?0:(float)gamepad.LeftThumbX/short.MinValue*-100;
leftThumb.y=(Math.Abs((float)gamepad.LeftThumbY)<死区)?0:(float)gamepad.LeftThumbY/short.MaxValue*100;
y=(Math.Abs((float)gamepad.righthumbx)<死区)?0:(float)gamepad.righthumbx/short.MaxValue*100;
righthumb.x=(Math.Abs((float)gamepad.righthumby)<死区)?0:(float)gamepad.righthumby/short.MaxValue*100;
leftTrigger=gamepad.leftTrigger;
rightTrigger=gamepad.rightTrigger;
}
}
这会造成死区,因为控制器上的操纵手柄永远不会完全归零。它还反转左X轴,以便两个斗杆输入匹配。Y正向上,X正向右:
leftThumb.x = (Math.Abs((float)gamepad.LeftThumbX ) < deadband) ? 0 : (float)gamepad.LeftThumbX / short.MinValue * -100;
leftThumb.y = (Math.Abs((float)gamepad.LeftThumbY ) < deadband) ? 0 : (float)gamepad.LeftThumbY / short.MaxValue * 100;
rightThumb.y = (Math.Abs((float)gamepad.RightThumbX) < deadband) ? 0 : (float)gamepad.RightThumbX / short.MaxValue * 100;
rightThumb.x = (Math.Abs((float)gamepad.RightThumbY) < deadband) ? 0 : (float)gamepad.RightThumbY / short.MaxValue * 100;
leftThumb.x=(Math.Abs((float)gamepad.LeftThumbX)<死区)?0:(float)gamepad.LeftThumbX/short.MinValue*-100;
leftThumb.y=(Math.Abs((float)gamepad.LeftThumbY)<死区)?0:(float)gamepad.LeftThumbY/short.MaxValue*100;
y=(Math.Abs((float)gamepad.RightThumbX)<死区)?0:(float)gamepad.RightThumbX/short.MaxValue*100;
rightThumb.x=(Math.Abs((float)gamepad.RightThumbY)<死区)?0:(float)gamepad.RightThumbY/short.MaxValue*100;
希望这对将来希望将xbox one控制器输入添加到其.NET应用程序的人有所帮助 +1另一种轻量级是,对于死区,您可能希望这样做,谢谢您提供的额外信息@也许我得去看看XInputDotNet!我不得不将我对控制器的轮询速率降低到大约100mhz(10毫秒的延迟),因为它在最大轮询时每2秒启动一次垃圾收集器。10毫秒轮询速率下无明显差异。