什么是SDL_Joystick,什么是SDL_GameController?两者之间有什么关系?

tom*_*101 7 c c++ sdl joystick sdl-2

SDL_Joystick和之间有什么关系SDL_GameController?这是我现在唯一知道的事情:

  • SDL_GameController 和相关的功能都是SDL2中引入的新API的一部分.
  • SDL_GameController和相关的功能建立在现有的SDL_JoystickAPI 之上.
  • (工作草案)您可以SDL_Joystick通过调用函数SDL_GameControllerGetJoystick()并传入一个实例来获取实例SDL_GameController.
  • (工作草案)您可以SDL_GameController通过调用SDL_JoystickInstanceID()并传入实例来获取第一个实例SDL_Joystick,然后传入SDL_JoystickIDto SDL_GameControllerFromInstanceID.

虽然SDL_Joystick并且SDL_GameController都是可以互换的,但似乎SDL_GameController在这里取代并慢慢地取得成功SDL_Joystick.

原因是,在轮询时SDL_Event,SDL_Event实例包含分别代表按钮和按钮的SDL_Event::jbuttonSDL_Event::cbutton结构.我想我可以使用任何一个或两个按钮事件进行播放器控件.SDL_JoystickSDL_GameController

我在这里错了.

我想问一下:

  • SDL_Joystick和之间有什么区别SDL_GameController
  • 难道SDL_Joystick现在参见该控制器?

    在此输入图像描述

    同样的SDL_GameController

    在此输入图像描述

  • 使用SDL_Joystick结束的优点/缺点是什么SDL_GameController(反之亦然)?

kel*_*tar 13

首先,SDL 游戏控制器是 SDL 操纵杆的扩展(就本答案的范围而言,当我说“控制器”或“操纵杆”时,我指的是 SDL 的实现,而不是一般的硬件设备类别)。正如维基百科所说:

此类别包含用于处理游戏控制器以及将操纵杆映射到游戏控制器语义的函数。这是建立在现有操纵杆 API 之上的。

如果您从 Steam 运行游戏,系统会自动为您的游戏提供游戏控制器映射。

SDL 在内部使用操纵杆事件并根据控制器映射对其进行处理以生成游戏控制器事件。因此,有人可能会说操纵杆是较低级别的东西,而游戏控制器是操纵杆的概括,以便为需要类似游戏手柄的输入设备的游戏产生更可预测/兼容(但更受限制)的游戏。

使用游戏控制器,您可以为一个类似 xbox 的控制器进行编程输入,SDL 将使用户的控制器与其兼容(有时需要用户的帮助 - 有太多不同的控制器,我们不可能期望 SDL 拥有所有这些的配置)。当然,如果控制器非常不同(或者根本不是控制器 - 例如飞行模拟杆、轮子等),那就会有问题。

基本上,游戏控制器为用户端提供类似 xbox 的按钮和轴,使应用程序开发人员无需支持控制器重新映射 - 因为重新映射是在 SDL 本身中完成的。对于一些流行的控制器, SDL 已经具有内置映射,而对于其他控制器,可以通过环境变量加载用户定义的映射。

还有一个配置工具可以简化最终用户的重新映射,包括将结果配置导出到所述环境变量。Steam 还有内置配置工具,该工具将其配置(据说 - 我从未使用过)导出到 SDL - 本质上使用户自己负责配置他们的控制器。