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; } } } }