
![]() |
A Biblioteca Multimídia SDL |


A SDL provê várias funções para tratamento direto de Joysticks, apesar de que a maioria dos casos pode também ser tratada via eventos. Observe que, para poder ler dados dos joysticks, seja por eventos ou pelas funções listadas abaixo, é necessário passar o parâmetro SDL_INIT_JOYSTICK para SDL_Init ou SDL_InitSubSystem.
int SDL_NumJoysticks(void);
const char *SDL_JoystickName(int index);
SDL_Joystick *SDL_JoystickOpen(int index);
int SDL_JoystickOpened(int index);
int SDL_JoystickIndex(SDL_Joystick *joystick);
void SDL_JoystickClose(SDL_Joystick *joystick);
A função SDL_NumJoysticks retorna a quantidade de joysticks instalados. Você pode então usar SDL_JoystickName para saber o nome (dado pelo Sistema Operacional) de cada um dos joysticks instalados. Exemplo:
int i;
for(i = 0; i < SDL_NumJoysticks(); i++)
{
printf("Nome do joystick %d: %s\n");
}
Após descobrir quantos joysticks estão instalados, antes de poder usar as funções aqui listadas, você precisa abrir (inicializar) um ou mais joysticks com a função SDL_JoystickOpen. Esta retorna um ponteiro para SDL_Joystick, uma estrutura interna da SDL cuja organização não nos interessa--apenas devemos conseguir um ponteiro para cada joystick que queiramos utilizar e passar este ponteiro para as funções chamadas. Você deve passar a SDL_JoystickOpen o índice (número de identificação) do joystick que quer abrir. Os joysticks são numerados de 0 a (SDL_NumJoysticks() - 1). Intuitivamente, a função SDL_JoystickOpened retorna um valor que indica se um dado joystick (descrito pelo ponteiro passado como parâmetro) está aberto (foi inicializado com sucesso) ou não. Já SDL_JoystickIndex retorna o índice de um joystick, passando-se um ponteiro para SDL_Joystick. Para completar, SDL_JoystickClose fecha (deinicializa) um joystick previamente aberto.
int SDL_JoystickNumAxes(SDL_Joystick *joystick);
int SDL_JoystickNumBalls(SDL_Joystick *joystick);
int SDL_JoystickNumHats(SDL_Joystick *joystick);
int SDL_JoystickNumButtons(SDL_Joystick *joystick);
Estas funções tomam como parâmetro um joystick previamente inicializado com SDL_JoystickOpen e retornam a quantidade de Eixos, Trackballs, Hats (POVs) e Botões (respectivamente) deste joystick. Os eixos normalmente correspondem ao direcional de um joystick (um D-Pad, ou um manche). Em geral os dois primeiros eixos (X e Y) são o direcional, e outros eixos que porventura existam correspondem a sliders. Em alguns casos, joysticks implementam botões extra usando eixos (explicado mais abaixo). Trackballs são bolinhas fixas, mas que podem ser giradas sobre seu próprio centro--elas funcionam mais ou menos como dois eixos (X e Y) que só têm movimento relativo (já que as trackballs não têm uma "origem" da rotação). Hats, ou POVs (Point-of-View) são botões especiais que possuem 9 estados: centro, cima, baixo, esquerda, direita e as diagonais. Você pode empurrá-los para uma das oito direções e eles voltam ao centro ao serem soltos--funcionam mais ou menos como joysticks de fliperama. Por último, deixemos por sua conta descobrir quem são os botões.
void SDL_JoystickUpdate(void);
Sint16 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis);
Uint8 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat);
Uint8 SDL_JoystickGetButton(SDL_Joystick *joystick, int button);
int SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy);
Estas são as funções efetivamente usadas para ler diretamente os dados de um joystick. Antes de tentar ler qualquer dado, é preciso chamar SDL_JoystickUpdate para que as variáveis internas sobre os joysticks recebam os valores do estado do hardware. Se você ativou processamento de eventos de joystick com SDL_JoystickEventState(SDL_ENABLE), esta função é chamada automaticamente por SDL_PollEvent dentro do seu loop de eventos. Abaixo descrevemos as funções de leitura--todas elas tomam como primeiro parâmetro um ponteiro para um joystick aberto.

O arquivo ex_joystick.c exemplifica as funções aqui listadas.
