如何在C#应用程序中使用Xbox One控制器

2024-06-12

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

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

网上的大部分信息都是针对 C++ 应用程序的,但我不想尝试编写自定义库,而是想使用类似的东西SharpDX http://sharpdx.org/。我如何在我的应用程序中使用它?

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


我发现最简单的入门方法是使用 SharpDX。来自夏普DX网站 http://sharpdx.org/:

SharpDX 是 DirectX API 的开源托管 .NET 包装器。

SharpDX 可在 nuget 上使用 https://www.nuget.org/packages/SharpDX/,因此在 Visual Studio 中开始使用它非常简单。

要开始使用,请访问Tools -> NuGet Package Manager -> Package Manager Console在 Visual Studios 内部(我使用的是 2015 社区版)。

然后只需输入:Install-Package SharpDX进入出现在 Visual Studios 底部的包管理器控制台。

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

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

希望这对将来想要向其 .NET 应用程序添加 Xbox One 控制器输入的人有所帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在C#应用程序中使用Xbox One控制器 的相关文章

随机推荐

  • 使用 PHP 发送器和 Swift 在后台未收到 IOS GCM 推送通知

    我正在努力让后台通知在带有 GCM 的 IOS 上工作 非后台通知已经可以工作了 以下是我集成后台通知的步骤 在 UIBackgroundmodes 中启用远程通知标签 将内容可用密钥添加到我的通知负载中 在我的委托中编写 applicat
  • 给定 A 列中的值,在 EXCEL 中查找 B 列中的最小值/最大值

    我有一列公交车站 ID 号 A 列 B 列是不同的时间 其中每个值都是一个人上 下车的时间 为了知道公交车停了多长时间 我想在给定 A 的某个值的情况下找到 B 列中的最大值 最小值之间的差异 84009 9 17 38 AM 84009
  • 在 Matlab 中将 datenum 转换为 datetime 的最快方法

    我在 Matlab 中将 datenum 转换为 datetime 时遇到问题 Given dnum floor now floor now 1 我尝试了以下方法 datenum dnum 但这没有用 我发现有效的方法是 datetime
  • 如何使用cmake自动构建第三方库

    我在寻找什么 下载库 提取它 应用自定义补丁 运行配置 运行构建命令 我正在尝试构建的库是 Openssl Boost Thrift C ares Curl Pcre Nginx ICU JsonCPP 我想我可以使用外部模块做这些事情 h
  • Node.js Socket.IO 无法完全工作

    我运行一个侦听端口 5000 的独立服务器 当我通过 Netcat 或 Telnet 连接到它时 该应用程序不会在终端上打印任何内容 但在 Netcat Telnet 应用程序屏幕上 它显示连接已建立 var io require sock
  • 如何在 SPA 应用程序中从 Web API 访问 Graph API

    我有一个与 WebAPI 通信的 Angular 应用程序 并且用户根据 Azure Active Directory 进行身份验证 我按照这里的示例进行操作https github com Azure Samples active dir
  • 如何使用 JQuery 选择没有特定子元素的元素

    是否有一个 JQuery 选择器来选择所有元素not有某个子元素作为直接子元素吗 例如 p text in paragraph p p p div text in div div 我只想选择 p 就像第一个 没有 p div 孩子 这可能吗
  • 如何将CSS应用于iframe?

    我有一个简单的页面 其中有一些 iframe 部分 用于显示 RSS 链接 如何将主页中相同的 CSS 格式应用到 iframe 中显示的页面 Edit 这不能跨域工作 除非有适当的CORS 标头 https developer mozil
  • Cassandra .setFetchSize() on 语句不被遵守

    我想在UI上实现分页 所以我这样设置fetchSize boundStatement setFetchSize 20 但 setFetchSize 不被尊重 截至目前 我的表有 400 行 并且所有 400 行均已检索 当我使用检索下一组行
  • 关闭窗口时出现警告框,但重新加载时不出现警告框

    我正在寻找一种方法让我的用户知道他们在关闭窗口时必须注销 我已经建立了这段代码 window onbeforeunload confirmExit function confirmExit return It is better if yo
  • 如何修复 Django 应用程序的评论视图中的此错误?

    我正在尝试用 Django 开发一个应用程序 目前 我正在尝试创建一个评论部分 供用户使用表单撰写和提交评论 我制作了一个模板 显示电影的信息以及用户可以对电影发表评论的表单 问题是 当我编写评论并尝试提交时 会出现此错误 myapp2 2
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 在自定义 Sonar 规则中获取 Java 方法注释的正确方法

    我尝试编写一个自定义声纳规则 Java 并努力寻找正确的方法来获取调用的 Java 方法的注释 该规则应该检测对标记为的方法和字段的非法访问 VisibleForTesting 从生产代码访问此类元素是非法的 但从同一类访问此类元素是合法的
  • 按文件类型设置 Vim 空白首选项

    在我的工作中 我需要遵循房屋风格进行缩进 如下所示 编码 html 和 ruby 时有 2 个空格 编码 javascript 时使用制表符 建议使用 tabwidth 4 为每个文件类型指定不同的空白首选项的最佳方法是什么 方法有很多 但
  • NSData initWithBytesNoCopy:length:freeWhenDone 的行为:

    我想要一个固定长度的可变内容共享数据缓冲区 这就是我如何创建它 void buffer malloc length initialize buffer content NSData sharedData NSData alloc initW
  • 当你在Java中使用Frame或JFrame时? [复制]

    这个问题在这里已经有答案了 可能的重复 swing 和 awt 有什么区别 https stackoverflow com questions 408820 what is the difference between swing and
  • “'OFFSET'附近的语法不正确”将sql comm 2012修改为2008

    我用这个列出问题 SELECT q qTitle q qDescription q qCreatedOn u uCode u uFullname qcat qcatTitle q qId q qStatus FROM tblQuestion
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 合并 Perl Hashref 和 unique

    我有两个 Perl 哈希值 内容如下 First VAR1 name1 gt adam bob name2 gt Miller Schumacher Second VAR1 name1 gt tina jason jeff
  • 如何在C#应用程序中使用Xbox One控制器

    已经存在大量有关在 C 中使用 Xbox 360 控制器的信息 但我没有找到有关 Xbox One 控制器的那么多信息 我需要非常基本的操作 特别是操纵杆和触发器值 网上的大部分信息都是针对 C 应用程序的 但我不想尝试编写自定义库 而是想