Os traigo dos ejemplos de código con joysticks. ¡Me lo he pasado como un niño pequeño!
El primer código simplemente lista los joystick conectados y algunos detalles, mientras que el segundo mueve un personaje (imagen) por la pantalla. Es una chorrada, ¡pero cómo me lo he pasado! Diez minutos moviendo el joystick como un imbécil viendo cómo se movía el personaje al mismo tiempo.
Información joysticks: Pulsa para ver/ocultar el código
// Programa de pruebas. Información acerca del joystick
// Abriendo un dispositivo
#include <iostream>
#include <SDL/SDL.h>
using namespace std;
int main(){
// Iniciamos el subsistema de video
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
cerr << "No se pudo iniciar SDL: %s\n" << SDL_GetError();
exit(1);
}
atexit(SDL_Quit);
// Comprobamos que sea compatible el modo de video
if (SDL_VideoModeOK(640, 480, 24, SDL_HWSURFACE|SDL_DOUBLEBUF) == 0) {
cerr << "Modo no soportado: " << SDL_GetError() << endl;
exit(1);
}
// Consultamos el número de joysticks existentes
int num_joysticks = SDL_NumJoysticks();
// Si no hay joysticks conectados
if (num_joysticks < 1) {
cerr << "Conecte un dispositivo de juego antes de ejecutar" << endl;
exit(1);
} else {
// Al menos hay uno
cout << "Hay conectados " << num_joysticks << " joysticks. " << endl;
}
// Mostramos información de cada uno de los joysticks
for ( int i = 0; i < num_joysticks; i++) {
// Obtenemos el nombre del joystick
const char *nombre = SDL_JoystickName(i);
// Lo abrimos
SDL_Joystick *joy = SDL_JoystickOpen(i);
// Mostramos en pantalla toda la información
// disponible del joystick
cout << "Abrimos el joystick " << nombre << " - " << i << endl;
cout << "\tTiene " << SDL_JoystickNumAxes(joy) << " ejes" << endl;
cout << "\tTiene " << SDL_JoystickNumButtons(joy) << " botones" << endl;
// Cerramos el joystick
SDL_JoystickClose(joy);
}
return 0;
}
Manejo Joysticks: Pulsa para ver/ocultar el código
// Programa de pruebas. Joystick captura de movimientos
// Consultando el estado del joystick directamente
#include <iostream>
#include <SDL/SDL.h>
using namespace std;
int main() {
// Iniciamos el subsistema de video
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
cerr << "No se pudo iniciar SDL: " << SDL_GetError() << endl;
exit(1);
}
atexit(SDL_Quit);
// Comprobamos que sea compatible el modo de video
if (SDL_VideoModeOK(640, 480, 24, SDL_HWSURFACE|SDL_DOUBLEBUF) == 0) {
cerr << "Modo no soportado: " << SDL_GetError() << endl;
exit(1);
}
// Establecemos el modo de video
SDL_Surface *pantalla;
pantalla = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (pantalla == NULL) {
cerr << "No se pudo establecer el modo de video: " << SDL_GetError() << endl;
exit(1);
}
// Cargamos una imagen en una superficie
SDL_Surface *personaje = SDL_LoadBMP("Imagenes/personaje.bmp");
if (personaje == NULL) {
cerr << "No se pudo cargar la imagen: " << SDL_GetError() << endl;
exit(1);
}
// Establecemos el color de la transparencia
// No será mostrado al realizar el blitting
SDL_SetColorKey(personaje, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(personaje->format, 255, 255, 255));
// Posición inicial del personaje
SDL_Rect posicion;
posicion.x=300;
posicion.y=200;
posicion.w=personaje->w;
posicion.h=personaje->h;
// Copiamos la imagen en la superficie principal
SDL_BlitSurface(personaje, NULL, pantalla, &posicion);
// Mostramos la pantalla "oculta" del búffer
SDL_Flip(pantalla);
// Si hay un joystick conectado lo abrimos
SDL_Joystick *joy;
if (SDL_NumJoysticks() > 0) {
joy = SDL_JoystickOpen(0);
cout << "\nAbrimos el joystick " << SDL_JoystickName(0) << " para la prueba. " << endl;
} else {
cout << "Para llevar acabo esta prueba debe haber un joystick " << "conectado. Si es así compruebe su configuración" << endl;
exit(1);
}
// Mostramos información del dispositivo
int num_ejes = SDL_JoystickNumAxes(joy);
int num_botones = SDL_JoystickNumButtons(joy);
cout << "Este joystick tiene " << num_ejes << " ejes y " << num_botones << " botones." << endl;
cout << "\nPulse ESC para salir.\n" << endl;
// Variable auxiliar
SDL_Event evento;
for ( ; ; ) {
// Actualizamos el estado del joystick
SDL_JoystickUpdate();
// Recorremos todos los ejes en búsqueda de cambios de estado
for ( int i = 0; i < num_ejes; i++) {
int valor_eje = SDL_JoystickGetAxis(joy, i);
//cout << "Eje " << i << " -> " << valor_eje << endl;
if (valor_eje != 0) {
if (i == 0) {
if (valor_eje > 0)
posicion.x++;
if (valor_eje < 0)
posicion.x--;
} else {
if (valor_eje > 0)
posicion.y++;
if (valor_eje < 0)
posicion.y--;
}
}
}
// Limpiamos la pantalla
SDL_FillRect(pantalla, NULL, 0);
// Cambiamos la posición del personaje
SDL_BlitSurface(personaje, NULL, pantalla, &posicion);
// Actualizamos la pantalla principal
SDL_Flip(pantalla);
// Recorremos todos los botones en búsqueda acciones
for ( int i = 0; i < num_botones; i++) {
int pulsado = SDL_JoystickGetButton(joy, i);
if (pulsado) {
cout << "Ha pulsado el botón " << i << endl;
}
}
// Bucle que controla eventos de salida
while (SDL_PollEvent(&evento)) {
if (evento.type == SDL_KEYDOWN) {
if (evento.key.keysym.sym == SDLK_ESCAPE) {
SDL_JoystickClose(joy);
return 0;
}
}
if (evento.type == SDL_QUIT) {
SDL_JoystickClose(joy);
return 0;
}
}
}
}
