Mapeo del joystick en SDL

De Wiki GP32Spain, la enciclopedia libre.

Tabla de contenidos

Eventos básicos

En SDL y PyGame, el stick y los botones de la consola producen eventos del tipo JoyButtonEvent.

Desplazamiento del stick Código de evento
Arriba 0
Abajo 4
Izquierda 2
Derecha 6
Arriba-Izquierda 1
Arriba-Derecha 7
Abajo-Izquierda 3
Abajo-Derecha 5
Botón del stick 18

En otras palabras,

1---0---7

2---18---6

3---4---5

Botones Código de evento
A 12
B 13
X 14
Y 15
L 10
R 11
Start 8
Select 9
Vol - 17
Vol + 16


Algunas consideraciones

  • Al ejecutar la instrucción SDL_Init, asegúrate de que inicializas el joystick (flag SDL_INIT_JOYSTICK).
  • Para inicializar el joystick, es necesario añadir
SDL_Joystick* joystick = SDL_JoystickOpen(0);
  • Antes de finalizar, es necesario cerrar el dispositivo mediante
SDL_JoystickClose(joystick);
  • El bucle de detección de eventos, se obtendrán eventos del tipo SDL_JOYBUTTONDOWN y SDL_JOYBUTTONUP
  • Cuando se genera un evento podemos saber qué botón o movimiento del stick ha sido activado (SDL_JOYBUTTONDOWN) o desactivado (SDL_JOYBUTTONUP) accediendo a event.jbutton.button, que es del tipo Uint8, y que corresponde con los valores especificados en el apartado anterior. Por ejemplo, la pulsación del botón A de la consola hará que event.jbutton.button valga 12.


Ejemplos

Bucle de detección de eventos en C

SDL_Event event;
while(SDL_PollEvent(&event))
{
  switch(event.type)
  {
    case SDL_JOYBUTTONDOWN:
    {
      switch(event.jbutton.button)
      {
        case GP2X_BUTTON_X:
          // Se ha pulsado el botón X
          break;
        case GP2X_BUTTON_L:
          // Se ha pulsado el botón L
          break;
      }
      break;
    }
    case SDL_JOYBUTTONUP:
    {
      switch(event.jbutton.button)
      {
        case GP2X_BUTTON_X:
          // Se ha soltado el botón X
          break;
        case GP2X_BUTTON_L:
          // Se ha soltado el botón L
          break;
      }
      break;
    }
  }
}


Detección de eventos en Python

import gp2x

# Inicialización
num_joysticks = pygame.joystick.get_count()
if num_joysticks > 0:
  stick = pygame.joystick.Joystick(0)
  stick.init()

# Bucle de detección de eventos
while 1:
   event = pygame.event.poll()
   print "got event"
   print repr(event) 
   if event.type == pygame.NOEVENT:
       print "No hay mas eventos por ahora"
       break
   if event.type == pygame.QUIT:
       print "Evento QUIT"
       running = 0
   elif event.type == pygame.JOYBUTTONDOWN:
       if event.button == gp2x.BUTTON_X:
           print "Has pulsado X"
       elif event.button == gp2x.BUTTON_Y:
           print "Has pulsado Y"
       else:
           print "Has pulsado otro botón"
   elif event.type == pygame.JOYBUTTONUP:
       if event.button == gp2x.BUTTON_X:
           print "Has soltado X"
       elif event.button == gp2x.BUTTON_Y:
           print "Has soltado Y"
       else:
           print "Has soltado otro botón"

Ficheros de cabecera de muestra

En C

#define GP2X_BUTTON_UP              (0)
#define GP2X_BUTTON_DOWN            (4)
#define GP2X_BUTTON_LEFT            (2)
#define GP2X_BUTTON_RIGHT           (6)
#define GP2X_BUTTON_UPLEFT          (1)
#define GP2X_BUTTON_UPRIGHT         (7)
#define GP2X_BUTTON_DOWNLEFT        (3)
#define GP2X_BUTTON_DOWNRIGHT       (5)
#define GP2X_BUTTON_CLICK           (18)
#define GP2X_BUTTON_A               (12)
#define GP2X_BUTTON_B               (13)
#define GP2X_BUTTON_X               (14)
#define GP2X_BUTTON_Y               (15)
#define GP2X_BUTTON_L               (10)
#define GP2X_BUTTON_R               (11)
#define GP2X_BUTTON_START           (8)
#define GP2X_BUTTON_SELECT          (9)
#define GP2X_BUTTON_VOLUP           (16)
#define GP2X_BUTTON_VOLDOWN         (17)

En Python (gp2x.py)

BUTTON_UP            = (0)
BUTTON_DOWN          = (4)
BUTTON_LEFT          = (2)
BUTTON_RIGHT         = (6)
BUTTON_UPLEFT        = (1)
BUTTON_UPRIGHT       = (7)
BUTTON_DOWNLEFT      = (3)
BUTTON_DOWNRIGHT     = (5)
BUTTON_CLICK         = (18)
BUTTON_A             = (12)
BUTTON_B             = (13)
BUTTON_X             = (14)
BUTTON_Y             = (15)
BUTTON_L             = (10)
BUTTON_R             = (11)
BUTTON_START         = (8) 
BUTTON_SELECT        = (9)
BUTTON_VOLUP         = (16)
BUTTON_VOLDOWN       = (17)

Configuraciones del Joystick recomendadas

A continuación exponemos varias configuraciones de la interfaz del joystick basadas en las propuestas de DaveC.

Imagen:joystick.png

  • El Caso 1 podría ser bueno para juegos nativos de la GP2X, así como para juegos que usen manetas analógicas o trackballs como Centipede, Missile Command o para emular el movimiento de ratones como en el ST/Amiga.
  • El Caso 2 sería la configuración ideal para usar en emuladores y cualquier juego que requiera un control tradicional de 8 direcciones. En los mandos típicos de 4 contactos y 8 direcciones siempre fue más fácil pulsar las ortogonales (horizontales y verticales) que las diagonales, debido a que es más difícil mantener pulsados dos contactos simultáneamente que uno solo. Esta configuración se aplicaría a los joysticks de Atari 2600, crucetas de Nintendo, pads de PSX, MD, SNES, etc.
  • El Caso 3 sería útil para juegos con orientación isométrica como Desert Strike, Zaxxon... que se mueven principalmente en las diagonales, pero también, en menor medida, en sentido vertical u horizontal.
  • El Caso 4 sería útil para aplicaciones que no sean juegos como editores de texto. Ten en cuenta que si jugando haces contacto en la "zona muerta", en el momento equivocado, es sinónimo de muerte.
  • El Caso 5 sería interesante para juegos de 4 direcciones como el Pac-man. Las líneas púrpuras separan direcciones para su visualización. Cualquier contacto desde sw8 hasta sw1+sw2 sería considerado como "ARRIBA" e igual para el resto. Se configura ligeramente rotado para que todas las zonas tengan el mismo tamaño.
  • El Caso 6 se usaría en juegos de 4 direcciones diagonales como Q*Bert. Las líneas púrpuras separan direcciones para su visualización. Se configura ligeramente rotado para que todas las zonas tengan el mismo tamaño.

Los desarrolladores deberían pensar en utilizar diferentes configuraciones, si hiciera falta, dentro de un mismo programa. Por ejemplo, para el MAME se podría elegir los modos 1, 2, 3, 5 y 6, dependiendo del juego. Para otros sistemas como Megadrive con el caso 2 sería suficiente.

Personal tools