【发布时间】:2018-04-25 12:25:39
【问题描述】:
SDL_Joystick和SDL_GameController是什么关系?我现在知道的只有这些:
-
SDL_GameController和相关函数都是 SDL2 中引入的新 API 的一部分。 -
SDL_GameController和相关函数构建在现有的SDL_JoystickAPI 之上。 - (工作草案)您可以通过调用函数
SDL_GameControllerGetJoystick()并传入SDL_GameController的实例来获取SDL_Joystick的实例。 - (工作草案)您可以先调用
SDL_JoystickInstanceID()并传入SDL_Joystick的实例来获取SDL_GameController的实例,然后将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 实现是围绕 xbox 游戏手柄建模的(例如,从中借用按钮名称),但它与流行的游戏手柄模型相匹配,甚至有一个预设数据库和 configuration tools 重新映射一些奇怪的游戏手柄。这样您就可以对轴/按钮做出假设,而用户可以使用重新映射工具对其进行配置。
-
@keltar 所以,如果我将 SDL 实现想象成 C++ 面向对象的设计,
SDL_Joystick是SDL_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 有针对流行模型的内置映射,但“每个设备”部分是不现实的。然而,用户自己可以配置他们的设备映射(如果需要,可以将其上传给其他人使用)而无需修改游戏,因为可以通过环境变量加载重新映射文件。因此,从某种意义上说,您可以忽略重新映射问题,将其委托给最终用户自己。