¿Qué es SDL_Joystick y qué es SDL_GameController? ¿Cuáles son las relaciones entre los dos?

5 minutos de lectura

avatar de usuario de tom_mai78101
tom_mai78101

¿Cuál es la relación entre SDL_Joystick y SDL_GameController? Estas son las únicas cosas que sé de ahora:

  • SDL_GameController y las funciones relacionadas forman parte de una nueva API introducida en SDL2.
  • SDL_GameController y las funciones relacionadas se construyen sobre las existentes SDL_Joystick API.
  • (Borrador de trabajo) Puede obtener una instancia de SDL_Joystick llamando a la función SDL_GameControllerGetJoystick() y pasando en una instancia de SDL_GameController.
  • (Borrador de trabajo) Puede obtener una instancia de SDL_GameController primero llamando a SDL_JoystickInstanceID() y pasando en una instancia de SDL_Joystickluego pase en el SDL_JoystickID a SDL_GameControllerFromInstanceID.

A pesar de SDL_Joystick y SDL_GameController Ambos son intercambiables, parece que SDL_GameController está aquí para reemplazar y tener éxito lentamente SDL_Joystick.

La razón es que, cuando se vota por SDL_Eventel SDL_Event instancia contiene tanto el SDL_Event::jbutton y SDL_Event::cbutton estructuras, que representan la SDL_Joystick botones y SDL_GameController botones, respectivamente. Supongo que puedo usar uno o ambos eventos de botón para los controles del jugador.

Podría estar equivocado aquí.

Me gustaría preguntar:

  • ¿Cuáles son las diferencias entre SDL_Joystick y SDL_GameController?
  • Es SDL_Joystick ahora se refiere a este controlador?

    ingrese la descripción de la imagen aquí

    Y lo mismo para SDL_GameController?

    ingrese la descripción de la imagen aquí

  • ¿Cuáles son las ventajas/desventajas de usar SDL_Joystick sobre SDL_GameController (y viceversa)?

  • Tu descripción suena casi correcta. El joystick es un nivel un poco más bajo: hay botones, ejes y cabañas, pero puede representar cualquier configuración. Gamepad es mucho más limitado, con la implementación de SDL modelada en torno a xbox gamepad (por ejemplo, toma prestados los nombres de los botones), pero coincide con los modelos de gamepad populares e incluso tiene una base de datos de ajustes preestablecidos y herramientas de configuración para reasignar algunos gamepads extraños. De esa manera, puede hacer suposiciones sobre ejes/botones, mientras que el usuario puede usar la herramienta de reasignación para configurarlo.

    – keltar

    25 de abril de 2018 a las 13:59

  • @keltar Entonces, si tuviera que imaginar la implementación de SDL como un diseño orientado a objetos de C++, SDL_Joystick es la clase padre de SDL_GameController?

    – tom_mai78101

    25 de abril de 2018 a las 14:06


  • En cierto modo, sí. Observa los eventos del joystick y genera eventos del controlador de juegos a partir de ellos.

    – keltar

    25 de abril de 2018 a las 14:59

  • @keltar Gracias. También encontré esta cita en otro lugar de Google, pero perdí el enlace. Decía 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. ¿Es esto cierto?

    – tom_mai78101

    25 de abril de 2018 a las 15:11

  • Si y no. SDL tiene asignaciones integradas para modelos populares, pero la parte de “todos los dispositivos” no es realista. Sin embargo, los propios usuarios pueden configurar la asignación de su dispositivo (y cargarla para que la usen otros, si lo desean) sin modificar el juego, ya que los archivos de reasignación se pueden cargar a través de variables de entorno. Entonces, en cierto sentido, puede ignorar el problema de reasignación, delegándolo a los propios usuarios finales.

    – keltar

    25 de abril de 2018 a las 15:17

En primer lugar, los controladores de juegos SDL son la extensión de los joysticks SDL (para el alcance de esta respuesta, cuando digo “controlador” o “joystick”, me refiero a la implementación de SDL, no a la categoría de dispositivos de hardware en general). Como wiki dice,

Esta categoría contiene funciones para manejar controladores de juegos y para asignar joysticks a la semántica de controladores de juegos. Esto se basa en la API de joystick existente.

Si está ejecutando su juego desde Steam, la asignación del controlador del juego se proporciona automáticamente para su juego.

SDL interno usos eventos joystic y los procesa para producir eventos de controlador de juego de acuerdo con el mapeo del controlador. Por lo tanto, se puede decir que el joystick es algo de nivel inferior, mientras que el controlador de juego es una generalización de los joysticks para producir juegos más predecibles/compatibles (pero más restringidos) que necesitan dispositivos de entrada similares a gamepad.

Con el controlador de juegos, puede programar la entrada para solo un controlador similar a Xbox, y SDL hará que el controlador del usuario sea compatible con eso (a veces con la ayuda del usuario; hay demasiados controladores diferentes, no podemos esperar que SDL tenga configuraciones para todos ellos). Por supuesto, si el controlador es muy diferente (o no tiene controlador en absoluto, por ejemplo, palos de impulso de mosca, ruedas, etc.), eso sería problemático.

Básicamente, el controlador de juegos proporciona botones y ejes similares a los de Xbox para el lado del usuario, lo que libera al desarrollador de la aplicación de la necesidad de admitir la reasignación del controlador, ya que la reasignación se realiza en SDL. Para algunos controladores populares SDL ya tiene asignaciones integradas, y para otros, la asignación definida por el usuario se puede cargar a través de Variable ambiental.

También hay una herramienta de configuración eso simplifica la reasignación para el usuario final, incluida la exportación de la configuración resultante a dicha variable de entorno. Steam también tiene una herramienta de configuración incorporada, cuya configuración (supuestamente, nunca la he usado) exporta a SDL, lo que esencialmente hace que los usuarios sean responsables de configurar sus controladores.

¿Ha sido útil esta solución?