Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#应用程序中使用xbox one控制器_C#_Sharpdx - Fatal编程技术网

如何在C#应用程序中使用xbox one控制器

如何在C#应用程序中使用xbox one控制器,c#,sharpdx,C#,Sharpdx,在C#中已经有大量关于使用xbox 360控制器的信息,但我没有找到xbox one控制器的信息 我需要非常基本的操作,特别是操纵杆和触发值 P>在线信息大部分是C++应用程序,但我不想尝试编写自定义库,我想使用类似的东西。我如何在我的应用程序中使用它 注意:我发布此消息是为了分享我发现的信息,并为自己记录我的发现。不过,我很想听听其他将控制器输入到.NET应用程序的方法。我发现最简单的入门方法是使用SharpDX。从: SharpDX是DirectX API的开源托管.NET包装器 ,所以在

在C#中已经有大量关于使用xbox 360控制器的信息,但我没有找到xbox one控制器的信息

我需要非常基本的操作,特别是操纵杆和触发值

<> P>在线信息大部分是C++应用程序,但我不想尝试编写自定义库,我想使用类似的东西。我如何在我的应用程序中使用它


注意:我发布此消息是为了分享我发现的信息,并为自己记录我的发现。不过,我很想听听其他将控制器输入到.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毫秒轮询速率下无明显差异。