c++ - 什么是 SDL_Joystick,什么是 SDL_GameController?两者之间有什么关系?
问题描述
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
to来获取实例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 的实现,而不是一般的硬件设备类别)。正如维基所说,
此类别包含用于处理游戏控制器和将操纵杆映射到游戏控制器语义的函数。这是建立在现有的操纵杆 API 之上的。
如果您从 Steam 运行游戏,则会自动为您的游戏提供游戏控制器映射。
SDL 在内部使用Joystic 事件并根据控制器映射对其进行处理以生成游戏控制器事件。因此,有人可能会说,joystic 是较低级别的东西,而游戏控制器是对操纵杆的概括,为需要类似游戏手柄的输入设备的游戏产生更可预测/兼容(但更受限制)。
使用游戏控制器,您可以为一个类似 xbox 的控制器编程输入,而 SDL 将使用户的控制器与之兼容(有时在用户的帮助下 - 有太多不同的控制器,我们不可能期望 SDL 拥有所有这些配置)。当然,如果控制器非常不同(或根本不是控制器 - 例如飞行模拟棒、轮子等),那将是有问题的。
基本上,游戏控制器为用户端提供类似于 xbox 的按钮和轴,使应用程序开发人员无需支持控制器重新映射 - 因为重新映射是在 SDL 本身中完成的。对于一些流行的控制器,SDL 已经具有内置映射,而对于其他一些用户定义的映射,可以通过环境变量加载。
还有一个配置工具可以简化最终用户的重新映射,包括将结果配置导出到所述环境变量。Steam 也有内置的配置工具,它的配置(据说 - 我从未使用过)导出到 SDL - 基本上让用户自己负责配置他们的控制器。
推荐阅读
- javascript - 防止通过 Inspector 更改表单/隐藏输入(特别是使用 WordPress)
- azure - 适用于 Web 应用的 Azure ARM 模板未正确配置从中导出的资源
- html - 如何将 excel 中的动态编码超链接转换为等效的 HTML 代码?
- docker - 如何以非交互方式调用 docker-compose 运行命令 - SSH?
- angular - 将 Angular 7 项目转换为 Angular 7 库
- mysql - 是否可以在 mysql 的列中使用数学函数?
- listview - 在 Flutter 的 3000 个项目列表中更改项目的状态
- google-cloud-firestore - Firestore 数据库规则 获取文档
- javascript - slideUp/slideDown 滑动两个(全部)子菜单
- javascript - Lodash 查找对象数组