Joystick
SDL le dedica un subsistema sólo para ello, pero no es le más completo debido a que hay muchos y no siguen un estándar.
Gestión mediante eventos
Los ejes de movimiento del joystick producen el evento de tipo SDL_JoyAxisEvent:
typedef struct{
Uint8 type; // al mover el eje produce SDL_JOYAXISMOTION
Uint8 which; //que joystick
Uint8 axis; //que eje
Sint16 value; //valor del movimiento
} SDL_JoyAxisEvent;
El valor del movimiento depende de si es un eje gradual o analógico (-32768,32768) o un eje digital o determinista (mínimo, cero, máximo).
En el caso de los botones producen:
typedef struct{
Uint8 type; // SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP
Uint8 which; //que joystick
Uint8 button; //que botón
Uint8 state; //redundante: SDL_PRESSED, SDL_RELEASED
} SDL_JoyButtonEvent;
Inicialización del joystick
Tenemos que inicial el subsistema del joystick al inicio con SDL_Init, pasańdole la constante SDL_INIT_JOYSTICK, para posteriormente abrir el joystick. Tener en cuenta que los index empiezan en cero.
SDL_Joystick* SDL_JoystickOpen(int index);
Cerrar el joystick
void SDL_JoystickClose(SDL_Joystick *joystick);
Que joysticks están abiertos:
int SDL_JoystickOpened(int index);
Eventos menos usados en Joysticks corresponden a los minijoystick o hat, el cual tiene 9 posiciones.
typedef struct{
Uint8 type;
Uint8 which;
Uint8 hat;
Uint8 value;
}SDL_JoyHatEvent
Las nueve posiciones de las que dispone se determinan con 5 constantes:
- SDL_HAT_CENTERED
- SDL_HAT_UP
- SDL_HAT_RIGHT
- SDL_HAT_LEFT
- SDL_HAT_DOWN
- SDL_HAT_RIGHTUP
- SDL_HAT_RIGHTDOWN
- SDL_HAT_LEFTUP
- SDL_HAT_LEFTDOWN
Otro elemento menos usado todavía es el trackball, su evento sólo es válido cuando no está integrado en un ratón o teclado.
typedef struct{
Uint8 type;
Uint8 which;
Uint8 ball; //SDL presupone que puede haber varios en un joystick
Sint16 xrel, yrel;
}SDL_JoyBallEvent;
Acceso directo al Joystick
Además de consultar el estado del joystick, podemos saber sus características (botones y ejes).
Número de joysticks
int SDL_NumJoysticks(void);
Nombre del Joystick
const char *SDL_JoystickName(int index);
Número de ejes
int SDL_JoysticksNumAxes(SDL_Joystick *joystick);
Número de botones
int SDL_JoysticksNumButtons(SDL_Joystick *joystick);