什么是SDL_Joystick和SDL_GameController?它们之间有什么关系?

19

SDL_JoystickSDL_GameController之间的关系是什么?目前我所知道的只有这些:

  • SDL_GameController及其相关功能都是在SDL2中引入的新API的一部分。
  • SDL_GameController及其相关功能是建立在现有的SDL_Joystick API之上的。
  • (工作草案)您可以通过调用函数SDL_GameControllerGetJoystick()并传递SDL_GameController的实例来获得SDL_Joystick的实例。
  • (工作草案)您可以先调用SDL_JoystickInstanceID()并传递SDL_Joystick的实例来获取SDL_GameController的实例,然后将SDL_JoystickID传递给SDL_GameControllerFromInstanceID

尽管SDL_JoystickSDL_GameController是可以互换使用的,但似乎SDL_GameController将取代并逐渐代替SDL_Joystick

原因是,当轮询SDL_Event时,SDL_Event实例同时包含SDL_Event::jbuttonSDL_Event::cbutton结构,分别表示SDL_Joystick按钮和SDL_GameController按钮。我猜我可以使用任何一个或两个按钮事件来控制玩家。

我可能是错的。

我想问:

  • SDL_JoystickSDL_GameController之间有什么区别?

  • SDL_Joystick现在是否指的就是这个控制器?

    enter image description here

那对于SDL_GameController来说也是一样吗?

输入图像描述

  • 使用SDL_JoystickSDL_GameController分别有什么优缺点(互相之间的)?


  • 你的描述听起来几乎正确。操纵杆是一个较低级别的设备,它有按钮、轴和帽等元素,但它可以表示任何配置。游戏手柄则更加受限,SDL实现模仿了Xbox手柄(例如借用了其按钮名称),但它匹配流行的游戏手柄型号甚至还有预置数据库和配置工具(http://generalarcade.com/gamepadtool/)以重新映射一些奇怪的游戏手柄。这样,您可以做出关于轴/按钮的假设,而用户则可以使用重新映射工具进行配置。 - keltar
    @keltar 所以,如果我把SDL的实现想象成一个C++面向对象的设计,SDL_JoystickSDL_GameController的父类? - tom_mai78101
    在某种程度上,是的。它会监视游戏手柄事件并从中生成游戏控制器事件。 - keltar
    @keltar 谢谢。我在 Google 上的某个地方也找到了这句话,但我丢失了链接。它说:“如果您在游戏中使用 SDL_GameController 而不是 SDL_Joystick,则在将游戏移植到每个设备上时,您将拥有相同的按钮映射。” 这是真的吗? - tom_mai78101
    1
    是的和不是的。SDL内置了流行模型的映射,但“每个设备”部分是不现实的。然而,用户可以自己配置其设备映射(如果需要,还可以上传给其他人使用),而无需修改游戏,因为重新映射文件可以通过环境变量加载。因此,在某种意义上,您可以忽略重新映射问题,将其委托给最终用户自己处理。 - keltar
    1个回答

    10
    首先,SDL游戏控制器是SDL游戏杆的扩展(在本答案中,“控制器”或“游戏杆”指的是SDL的实现,而不是一般的硬件设备类别)。正如维基所述,

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

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

    内部上,SDL 使用 游戏杆事件,并根据控制器映射将其处理为游戏控制器事件。因此,可以说游戏杆是更低级别的东西,而游戏控制器是对游戏杆的概括,以产生更可预测/兼容(但更受限制)的游戏,这些游戏需要类似于游戏手柄的输入设备。
    使用游戏控制器,您可以仅为一个类似于Xbox的控制器编程,而SDL会使用户的控制器与之兼容(有时需要用户的帮助-有太多不同的控制器,我们不可能期望SDL对所有控制器都有配置)。当然,如果控制器非常不同(或根本不是控制器-例如飞行模拟杆,方向盘等),这将是有问题的。
    基本上,游戏控制器为用户端提供类似于Xbox的按钮和轴,使应用程序开发人员无需支持控制器重新映射-因为重新映射是在SDL本身中完成的。对于一些流行的控制器,SDL已经内置了映射,对于其他控制器,可以通过环境变量加载用户定义的映射。
    还有一个配置工具,可简化最终用户的重新映射,包括将结果配置导出到上述环境变量。Steam也有内置的配置工具,它(据说-我从未使用过)将其配置导出到SDL-实质上使用户自己负责配置其控制器。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接