【问题标题】:What is SDL_Joystick and what is SDL_GameController? What are the relationships between the two?什么是 SDL_Joystick,什么是 SDL_GameController?两者之间有什么关系?
【发布时间】:2018-04-25 12:25:39
【问题描述】:

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 现在指的是这个控制器吗?

    SDL_GameController 也一样?

  • SDL_GameController 相比,使用SDL_Joystick 有哪些优点/缺点(反之亦然)?

【问题讨论】:

  • 您的描述听起来恰到好处。操纵杆稍微低一点——有按钮、轴和小屋,但它可以代表任何配置。游戏手柄受到更多限制,SDL 实现是围绕 xbox 游戏手柄建模的(例如,从中借用按钮名称),但它与流行的游戏手柄模型相匹配,甚至有一个预设数据库和 configuration tools 重新映射一些奇怪的游戏手柄。这样您就可以对轴/按钮做出假设,而用户可以使用重新映射工具对其进行配置。
  • @keltar 所以,如果我将 SDL 实现想象成 C++ 面向对象的设计,SDL_JoystickSDL_GameController 的父类?
  • 在某种程度上,是的。它监视操纵杆事件并从中生成游戏控制器事件。
  • @keltar 谢谢。我还在谷歌的其他地方找到了这句话,但我丢失了链接。上面写着If you use SDL_GameController in a game instead SDL_Joystick, you'll have the same button mapping on every device you port your game on.这是真的吗?
  • 是和不是。 SDL 有针对流行模型的内置映射,但“每个设备”部分是不现实的。然而,用户自己可以配置他们的设备映射(如果需要,可以将其上传给其他人使用)而无需修改游戏,因为可以通过环境变量加载重新映射文​​件。因此,从某种意义上说,您可以忽略重新映射问题,将其委托给最终用户自己。

标签: c++ c sdl sdl-2 joystick


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2023-04-08
    • 2011-03-28
    • 2019-07-22
    • 2012-03-12
    • 2012-01-11
    相关资源
    最近更新 更多