游戏手柄输入


GameMaker Studio 2 具有许多用于从多个已连接的游戏手柄中检测模拟和数字控制信号的专用函数。这些函数类似于 设备输入,因为你可以检测最多四个连接的 XInput 游戏手柄(以及最多 8 个 DirectInput 游戏手柄),并使用相同的函数处理每个输入。请注意,当游戏手柄插入你的设备(或被删除)时,会触发异步 系统事件,你可以使用适当的函数处理该情况。

游戏手柄 “插槽” 从 0 开始索引,插槽 0 - 3 包含 仅用于 Xinput 游戏手柄,即:Xbox360 控制器和兼容机。但是,你也可以检查 DirectInput 游戏手柄的 4 - 11 插槽,这意味着当通过这些插槽连接时,你可以检测到许多其他型号的控制器。值得注意的是,当使用 DirectInput 游戏手柄时,由于控制器制造商实施 API 的分散和非标准化方式,下面给出的常量可能与按下它们时所期望的按钮完全不匹配。因此,建议你在游戏中使用某种游戏手柄设置屏幕,人们可以根据任何连接到设备的输入(手柄)重新定义游戏手柄按键,以缓解任何问题(在 Windows 桌面、Ubuntu、macOS 和 Android 目标平台,有游戏手柄 “映射” 函数可以帮助你达到此目的 ,而在其他所有目标平台上,你需要自己使用代码执行此操作)。另请注意,Direct Input 游戏手柄以 协作模式 运行,这意味着你的游戏只有在它是前台应用程序时才能访问它们,否则会导致 Direct Input 控制器 “丢失”,如果游戏失去焦点然后重新获得焦点则会再次 “找到” 该控制器(这可以在系统事件中检测到并进行处理)。

使用游戏手柄函数时,输入可以来自 按钮 和/或 帽子GameMaker Studio 2 将分配以下部分或全部内置常量(请注意,“帽子” 通常仅可以在非标准控制器上被检测到):

常量 描述
gp_face1 顶部按钮 1(这映射到 Xbox 360 控制器上的 “A” 和 PS 控制器上的 × 按钮)
gp_face2 顶部按钮 2(这映射到 Xbox 360 控制器上的 “B” 和 PS 控制器上的 按钮)
gp_face3 顶部按钮 3(这映射到 Xbox 360 控制器上的 “X” 和 PS 控制器上的 按钮)
gp_face4 顶部按钮 4(这映射到 Xbox 360 控制器上的 “Y” 和 PS 控制器上的 按钮)
gp_shoulderl 左肩按钮
gp_shoulderlb 左肩扳机
gp_shoulderr 右肩按钮
gp_shoulderrb 右肩扳机
gp_select 选择按钮(这是 DS4 控制器上的 PS 按钮)
gp_start 开始按钮(这是 PS4 控制器上的 “OPTIONS” 按钮)
gp_stickl 按下左摇杆(作为按钮)
gp_stickr 按下右摇杆(作为按钮)
gp_padu D-pad 上
gp_padd D-pad 下
gp_padl D-pad 左
gp_padr D-pad 右
gp_axislh 左摇杆水平轴(模拟)
gp_axislv 左摇杆垂直轴(模拟)
gp_axisrh 右摇杆水平轴(模拟)
gp_axisrv 右摇杆垂直轴(模拟)


为了更好地理解每个常量所代表的控制器的哪个部分,你可以参考以下的标准 Xinput 游戏手柄图像:你可以在下面找到所有游戏手柄函数列表:

  1. gamepad_is_supported
  2. gamepad_iget_guid
  3. gamepad_get_device_count
  4. gamepad_is_connected
  5. gamepad_get_description
  6. gamepad_get_button_threshold
  7. gamepad_set_button_threshold
  8. gamepad_axis_count
  9. gamepad_axis_value
  10. gamepad_button_check
  11. gamepad_button_check_pressed
  12. gamepad_button_check_released
  13. gamepad_button_count
  14. gamepad_button_value
  15. gamepad_hat_count
  16. gamepad_hat_value
  17. gamepad_set_vibration
  18. gamepad_set_axis_deadzone
  19. gamepad_set_colour

以下游戏手柄函数也存在,用于将内置常量重新映射到给定游戏手柄的直接物理输入。这些函数 仅适用于 Windows 桌面、Ubuntu、macOS 和Android 目标平台,在 Windows 上,它们 仅对 Direct input 设备 有效。虽然 GameMaker Studio 2 带有基于 SDL Gamepad Controller DB 的许多不同游戏手柄的映射,但是由于存在大量的控制器类型和品牌,所以不可能将 GML 常量正确映射到每个品牌和型号的游戏手柄输入,因此你可以使用这些函数创建自己的自定义映射。

  1. gamepad_get_mapping
  2. gamepad_test_mapping
  3. gamepad_remove_mapping


兼容性

以下列表显示了跨平台的当前兼容性(请注意,这将随着将来的更新而更改):

理想情况下,在 所有 目标平台上,你希望枚举可用游戏手柄 “插槽” 的列表,然后检查它们以查看是否检测到任何设备,如下所示:

var maxpads = gamepad_get_device_count();for (var i = 0; i < maxpads; i++)
    {
    if (gamepad_is_connected(i))
        {
        // 对手柄 “i” 做些什么
        }
    }