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

How to use xbox one controller in C# application

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

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

大多数在线信息都是针对 C++ 应用程序的,但我不想尝试编写自定义库,而是想使用类似 SharpDX 的东西。我如何在我的应用程序中使用它?

注意:我发布这篇文章是为了分享我发现的信息,并为我自己记录我的发现。不过,我很想听听其他将控制器输入到 .NET 应用程序的方法。

我发现最简单的入门方法是使用 SharpDX。来自 SharpDX website:

SharpDX is an open-source managed .NET wrapper of the DirectX API.

SharpDX is available on nuget,因此在 Visual Studios 中开始使用它非常简单。

要开始,请转到 Visual Studios 中的 Tools -> NuGet Package Manager -> Package Manager Console(我使用的是 2015 社区版)。

然后只需在出现在 Visual Studios 底部的程序包管理器控制台中键入:Install-Package SharpDX

然后 Visual Studios 将下载它并将其添加到您的解决方案中。现在进入代码。

因为我想从 xbox 控制器输入,我们只需要添加:
using SharpDX.XInput 到我们程序的顶部。

获取所有值的代码相当简单:

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;
    }
}

这会产生死区,因为控制器上的操纵杆永远不会完全 return 归零。它还反转左 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;

希望这对将来希望将 xbox one 控制器输入添加到他们的 .NET 应用程序的人有所帮助!