Lo primero que vamos a estudiar en este artículo es el manejo de eventos con SDL. Con los eventos vamos a poder capturar las acciones que mande el usuario desde el teclado, ratón o joystick.
Como hemos dicho los eventos nos ayudarán a capturar las intenciones del usuario en nuestro juego. Para ello SDL nos provee de una estructura llamada SDL_Event, la cual se encontrará escuchando hasta que se produzca algún evento en el juego. La estructura es la siguiente:
typedef union{
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_ExposeEvent expose;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SywWMEvent syswm;
} SDL_Event;
Una vez que tenemos nuestra estructura sólo tenemos que utilizar varias funciones para poder manejarlos. La primera función que vamos a ver es "SDL_PollEvent". A esta función se le pasa una referencia al evento que tengamos creado y devuelve 1 en el caso que exista algún evento pendiente y 0 en el caso que no. Una vez que sepamos que se ha producido un evento, lo primero es saber de que tipo es, para poder actuar en consecuencia. Para ello miramos la variable type de la estructura del evento. Esta puede contener cualquier de estos valores:
SDL_KEYDOWN: se produce cuando se presiona una tecla (key)
SDL_KEYUP: se produce cuando se suelta la tecla (key)
SDL_MOUSEMOTION: se produce cuando se mueve el ratón (motion)
SDL_MOUSEBUTTONDOWN: se produce cuando se presiona un botón del ratón (button)
SDL_MOUSEBUTTONUP: se produce cuando se suelta un botón del ratón (button)
SDL_JOYAXISMOTION: se produce cuando se mueven los ejes del joystick (jaxis)
SDL_JOYBUTTONDOWN: se produce cuando se presiona un botón del joystick (jbutton)
SDL_JOYBUTTONUP: se produce cuando se suelta un botón del ratón (jbutton)
SDL_VIDEORESIZE: se produce cuando se redimensiona la pantalla (resize)
SDL_QUIT: se produce al cerrar la ventana de la aplicación (quit)
Existen más tipos de eventos, y hasta pueden ser creados por el usuario, pero no es objetivo de este artículo. Cada uno de estos eventos tienen una varaible asociada en la estructura con la información necesaria para poder manejarlo. Esa variable es la que se encuentra entre paréntesis. Durante los artículos veremos como manejar algunos eventos, pero no todos. Se puede encontrar toda la información necesaria en la documentación de SDL.
A continuación vamos a poner un ejemplo de lo que podrían ser los eventos de un juego.
while (SDL_PollEvent(&event)) {
// Cerrar la ventana
if (event.type == SDL_QUIT) {
// código que se ejecuta al cerrar la ventana
}
// Pulsando una tecla
if (event.type == SDL_KEYDOWN) {
// código que se ejecuta al pulsar una tecla
// Comprobamos la tecla pulsada
if (event.key.keysym.sym==SDLK_P) {
// código que se ejecuta al pulsar la tecla P
}
if (event.key.keysym.sym==SDLK_ESCAPE) {
// código que se ejecuta al pulsar la tecla Escape
}
}
}
Por último vamos a ver una función muy interesante y muy útil. Esta es SDL_GetKeyState(NULL); que nos devuelve un Uint8 con el código de la tecla pulsada. En el ejemplo de la sección siguiente podemos ver como trabajar con esta función.
Cáda tecla tiene referenciado un código. En la siguiente lista podemos ver todo el teclado.
SDLK_BACKSPACE: retroceso
SDLK_TAB: tabulador
SDLK_CLEAR: clear
SDLK_RETURN: return
SDLK_PAUSE: pausa
SDLK_ESCAPE: escape
SDLK_SPACE: espacio
SDLK_EXCLAIM: '!' exclamación
SDLK_QUOTEDBL: '"' dobles comillas
SDLK_HASH: '#' hash
SDLK_DOLLAR: '$' dollar
SDLK_AMPERSAND: '&' ampersand
SDLK_QUOTE: ''' comillas simples
SDLK_LEFTPAREN: '(' paréntesis izquierdo
SDLK_RIGHTPAREN: ')' paréntesis derecho
SDLK_ASTERISK: '*' asterisco
SDLK_PLUS: '+' signo de suma
SDLK_COMMA: ',' coma
SDLK_MINUS: '-' signo menos
SDLK_PERIOD: '.' periodo
SDLK_SLASH: '/ barra derecha
SDLK_0: '0' número 0. Todos los números hasta el 9 llevan la misma forma.
SDLK_COLON: ':' dos puntos
SDLK_SEMICOLON: ';' punto y coma
SDLK_LESS: '<' signo menor que
SDLK_EQUALS: '=' signo igual
SDLK_GREATER: '>' signo mayor que
SDLK_QUESTION: '?' signo de interrogación
SDLK_AT: '@' arroba
SDLK_LEFTBRACKET: '[' corchete izquierdo
SDLK_BACKSLASH: '\' barra izquierda
SDLK_RIGHTBRACKET: ']' corchete derecho
SDLK_CARET: '^' caret
SDLK_UNDERSCORE: '_' guión bajo
SDLK_BACKQUOTE: '`' grave
SDLK_a: 'a' a. Todas las letras llevan la misma forma.
SDLK_DELETE: '^?' delete
SDLK_KP0: keypad 0. Todos los números del keypad hasta el 9 llevan la misma forma.
SDLK_KP_PERIOD: '.' periodo del keypad
SDLK_KP_DIVIDE: '/' división del keypad
SDLK_KP_MULTIPLY: '*' multiplicación del keypad
SDLK_KP_MINUS: '-' signo menos del keypad
SDLK_KP_PLUS: '+' signo más del keypad
SDLK_KP_ENTER: '\r' enter del keypad
SDLK_KP_EQUALS: '=' signo igual del keypad
SDLK_UP: cursor arriba
SDLK_DOWN: cursor abajo
SDLK_RIGHT: cursor derecha
SDLK_LEFT: cursor izquierda
SDLK_INSERT: tecla insert
SDLK_HOME: tecla inicio
SDLK_END: tecla fin
SDLK_PAGEUP: tecla avanzar página
SDLK_PAGEDOWN: tecla retroceder página
SDLK_F1: F1. Todas las funciones "F" llevan la misma forma.
SDLK_NUMLOCK: bloqueo numérico
SDLK_CAPSLOCK: bloqueo mayúsculas
SDLK_SCROLLOCK: scrollock
SDLK_RSHIFT: shift derecho
SDLK_LSHIFT: shift izquierdo
SDLK_RCTRL: ctrl derecho
SDLK_LCTRL: ctrl izquierdo
SDLK_RALT: alt derecho
SDLK_LALT: alt izquierdo
SDLK_RMETA: meta derecho
SDLK_RMETA: meta derecho
SDLK_LMETA: meta izquierdo
SDLK_LSUPER: tecla windows izquierda
SDLK_RSUPER: tecla windows derecha
SDLK_MODE: mode shift
SDLK_HELP: ayuda
SDLK_PRINT: imprimir
SDLK_SYSREQ: SysRq
SDLK_BREAK: break
SDLK_MENU: menu
SDLK_POWER: power
SDLK_EURO: euro
No es objetivo de este artículo ver todo lo referente a eventos sino dar unas nociones básicas de trabajo con ellos y poder usar el teclado en nuestros juegos.