首页 > 解决方案 > 什么是 SDL_Joystick,什么是 SDL_GameController?两者之间有什么关系?

问题描述

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

尽管SDL_JoystickSDL_GameController都可以互换,但似乎SDL_GameController是在这里取代并逐渐成功的SDL_Joystick.

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

我在这里可能是错的。

我想问一下:

标签: c++csdlsdl-2joystick

解决方案


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

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

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

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

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

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

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


推荐阅读