Código Joysticks con SDL

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

Etiquetas: ,,. Guarda el enlace permanente.

Deja un comentario ^^