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

What is SDL_Joystick and what is SDL_GameController? What are the relationships between the two?

SDL_JoystickSDL_GameController有什么关系?这些是我现在唯一知道的事情:

尽管 SDL_JoystickSDL_GameController 都可以互换,但似乎 SDL_GameController 在这里取代并慢慢继承 SDL_Joystick

原因是,当轮询 SDL_Event 时,SDL_Event 实例同时包含 SDL_Event::jbuttonSDL_Event::cbutton 结构,代表 SDL_Joystick 按钮和 SDL_GameController 按钮,分别。我想我可以使用一个或两个按钮事件来控制播放器。

我这里可能是错的。

我想问:

首先,SDL 游戏控制器是 SDL joystics 的扩展(对于这个答案的范围,当我说 "controller" 或 "joystick" 我指的是 SDL 的实现,而不是一般的硬件设备类别).正如 wiki 所说,

This category contains functions for handling game controllers and for mapping joysticks to game controller semantics. This is built on top of the existing joystick API.

If you are running your game from Steam, the game controller mapping is automatically provided for your game.

内部 SDL uses joystic 事件并处理它们以根据控制器映射生成游戏控制器事件。因此,有人可能会说 joystic 是较低级别的东西,而游戏控制器是对操纵杆的概括,可以为需要类似游戏手柄的输入设备的游戏产生更多 predictable/compatible(但更受限制)。

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

基本上,游戏控制器为用户端提供类似 xbox 的按钮和轴,使应用程序开发人员无需支持控制器重新映射 - 因为重新映射是在 SDL 本身中完成的。对于 some popular controllers SDL already have builtin mappings, and for others user-defined mapping can be loaded via environment variable.

还有一个 configuration tool 可以简化最终用户的重新映射,包括将生成的配置导出到所述环境变量。 Steam 也有内置的配置工具,它的配置(据说——我从来没有用过)导出到 SDL——本质上让用户自己负责配置他们的控制器。