街机摇杆

此页介绍使用 Windows.Gaming.Input.ArcadeStick 和通用 Windows 平台 (UWP) 的相关 API 进行街机摇杆编程的基本知识。

在本页中,你将了解如下内容:

  • 如何收集连接的街机摇杆及其用户的列表
  • 如何检测街机摇杆已添加或已移除
  • 如何从一个或多个街机摇杆读取输入
  • 如何像 UI 导航设备一样使用街机摇杆

街机摇杆概述

街机摇杆是一种输入设备,可重现立式街机的感觉,并配有高精度数字控件。 街机摇杆是面向肉搏战和其他街机式游戏的完美输入设备,适用于良好兼容全数字控件的任何游戏。 Windows 10 或 Windows 11 的 UWP 应用和 Xbox One 应用通过 Windows.Gaming.Input 命名空间支持街机摇杆。

街机摇杆配备了一个 8 向数字游戏杆,六个操作按钮(在下图中以 A1-A6 表示)和两个特殊按钮(以 S1 和 S2 表示);它们都是全数字输入设备,不支持模拟控件或震动。 街机摇杆还配备了用于支持 UI 导航的“视图”和“菜单”按钮,但它们并不用于支持游戏命令,也不能作为游戏杆按钮轻松使用。

Arcade stick with 4-directional joystick, 6 action buttons (A1-A6), and 2 special buttons (S1 and S2)

UI 导航

为了减轻支持多个不同输入设备进行用户界面导航造成的负担,并促进游戏和设备之间的一致性,大多数物理输入设备会同时充当独立的逻辑输入设备(称为 UI 导航控制器)。 UI 导航控制器可跨各种输入设备提供通用的 UI 导航命令词汇。

作为 UI 导航控制器,街机摇杆将导航命令必需组映射为游戏杆和“视图”、“菜单”、“操作 1”和“操作 2”按钮。

导航命令 街机摇杆输入
向上 摇杆向上
向下 摇杆向下
Left 摇杆向左
Right 摇杆向右
视图 视图按钮
菜单 “菜单”按钮
Accept 操作 1 按钮
Cancel 操作 2 按钮

街机摇杆不映射导航命令的任何可选集

检测和跟踪街机摇杆

检测与跟踪街机摇杆的工作原理与检测与跟踪游戏板完全相同,除非使用 ArcadeStick 类而不是 Gamepad 类。 有关详细信息,请参阅游戏板和振动

读取街机摇杆

确定感兴趣的街机摇杆后,即可从中收集输入。 但与你可能习惯的一些其他类型的输入不同,街机摇杆不会通过引发事件来传达状态更改。 相反,你需要通过对它们进行“轮询”来定期读取其当前状态。

轮询街机摇杆

轮询会捕获街机摇杆在精确时间点的快照。 这种收集输入的方法非常适合大多数游戏,因为它们的逻辑通常运行在一个确定的循环中,而不是由事件驱动;通常情况下,根据一次收集的输入解释游戏命令也会比根据一段时间内收集的许多单个输入进行解释更加简单。

可通过调用 GetCurrentReading 来轮询街机摇杆;此函数会返回 ArcadeStickReading,其中包含街机摇杆状态。

以下是轮询街机摇杆当前状态的示例。

auto arcadestick = myArcadeSticks[0];

ArcadeStickReading reading = arcadestick->GetCurrentReading();

除了街机摇杆状态之外,每个读数还包括一个精确指示检索状态时间的时间戳。 该时间戳对于关联之前读数的时间或者游戏模拟的时间非常有用。

读取按钮

每个街机摇杆按钮(游戏杆的四个方向、六个操作按钮和两个特殊按钮)均有一个数字读数,指出是按下(向下)还是释放(向上)。 为了提高效率,按钮读数不以单独的布尔值表示;而是全部打包到一个由 ArcadeStickButtons 枚举表示的单独位域中。

注意

街机摇杆配备了用于 UI 导航的其他按钮,例如“视图”和“菜单”按钮。 这些按钮不是 ArcadeStickButtons 枚举的一部分,只能作为 UI 导航设备通过访问街机摇杆进行读取。 有关详细信息,请参阅 UI 导航设备

按钮值从 ArcadeStickReading 结构的 Buttons 属性中读取。 因为此属性是位域,所以使用按位掩码隔离你感兴趣的按钮值。 设置相应位时按钮为按下(向下);否则,按钮为释放(向上)。

以下示例确定是否按下了“操作 1”按钮。

if (ArcadeStickButtons::Action1 == (reading.Buttons & ArcadeStickButtons::Action1))
{
    // Action 1 is pressed
}

以下示例确定是否释放了“操作 1”按钮。

if (ArcadeStickButtons::None == (reading.Buttons & ArcadeStickButtons::Action1))
{
    // Action 1 is released (not pressed)
}

有时你可能需要确定:何时将按钮从按下转换为释放或从释放转换为按下,是按下还是释放多个按钮,或者是否按特定方式安排一组按钮(按下一些按钮,释放一些按钮)。 有关如何检测这些条件的信息,请参阅检测按钮切换检测复杂按钮排列

运行 InputInterfacing 示例

InputInterfacingUWP 示例 (github) 演示如何同时使用街机摇杆和不同类型的输入设备,以及这些输入设备如何作为 UI 导航控制器运行。

另请参阅