SDL_Joystick
和SDL_GameController
有什么关系?这是我现在唯一知道的事情:
SDL_GameController
和相关函数都是SDL2中引入的新API的一部分。SDL_GameController
及相关功能构建在现有 SDL_Joystick
API 之上。SDL_Joystick
并传入
SDL_GameControllerGetJoystick()
的实例来获取SDL_GameController
的实例。SDL_GameController
并传入
SDL_JoystickInstanceID()
的实例来获取SDL_Joystick
的实例,然后将SDL_JoystickID
传入SDL_GameControllerFromInstanceID
。尽管
SDL_Joystick
和 SDL_GameController
都是可以互换的,但 SDL_GameController
似乎正在取代并慢慢继承 SDL_Joystick
。
原因是,当轮询
SDL_Event
时,SDL_Event
实例同时包含 SDL_Event::jbutton
和 SDL_Event::cbutton
结构体,分别代表 SDL_Joystick
按钮和 SDL_GameController
按钮。我想我可以使用一个或两个按钮事件来控制播放器。
我可能是错的。
我想问:
首先,SDL 游戏控制器是 SDL 操纵杆的扩展(就本答案的范围而言,当我说“控制器”或“操纵杆”时,我指的是 SDL 的实现,而不是一般的硬件设备类别)。正如wiki所说:
此类别包含用于处理游戏控制器和 将操纵杆映射到游戏控制器语义。这是建立在顶部的 现有操纵杆 API 的一部分。
如果您从 Steam 运行游戏,游戏控制器映射 会自动为您的游戏提供。
在内部 SDL 使用操纵杆事件并根据控制器映射对其进行处理以生成游戏控制器事件。因此,有人可能会说操纵杆是较低级别的东西,而游戏控制器是操纵杆的概括,以便为需要类似游戏手柄的输入设备的游戏产生更可预测/兼容(但更受限制)的游戏。
使用游戏控制器,您可以为一个类似 Xbox 的控制器进行编程输入,SDL 将使用户的控制器与其兼容(有时需要用户的帮助 - 有太多不同的控制器,我们不可能期望 SDL 能够兼容)有所有这些的配置)。当然,如果控制器非常不同(或者根本不是控制器 - 例如飞行模拟杆、轮子等),那就会有问题。
基本上,游戏控制器为用户端提供类似 xbox 的按钮和轴,使应用程序开发人员无需支持控制器重新映射 - 因为重新映射是在 SDL 本身中完成的。对于一些流行的控制器SDL已经有内置映射,对于其他控制器,用户定义的映射可以通过环境变量加载。
还有一个配置工具可以简化最终用户的重新映射,包括将结果配置导出到所述环境变量。 Steam 也有内置的配置工具,该工具将其配置(据说 - 我从未使用过)导出到 SDL - 本质上是让用户自己负责配置他们的控制器。