[Anterior] Tabla de Contenidos

Programando con SDL

Capturando Eventos

Un evento, es un suceso que ocurre en nuestra aplicación, por ejemplo al presionar un botón del mouse , una tecla, etc. El manejo de eventos se inicializa conjuntamente al manejo del subsistema de video.

SDL_Init(SDL_INIT_VIDEO);
Internamente SDL almacena todos los eventos sin procesar en un cola de eventos. SDL trata a los eventos a través de una union SDL_Event, la cual agrupa todas las estructuras de manejo de eventos en una mayor, por lo que solo se necesita saber los campos de cada estructura en cuestión.
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_QuitEvent quit;
    SDL_UserEvent user;
    SDL_SywWMEvent syswm;
    } SDL_Event;
A continuación se detalla cada una de las definiciones:

type: el tipo de evento.
active: evento de activación.
key: evento de teclado.
motion: evento de movimiento del mouse.
button: evento de botón del mouse.
jaxis: evento de movimiento de eje de joystick.
jball: evento de movimiento del trackball del joystick.
jhat: evento de movimiento del minijoystick (hat) del joystick.
jbutton: evento de botón del joystick.
resize: evento de redimensionado de ventana.
quit: evento de petición de cierre de aplicación.
user: evento definido por el usuario.
syswm: evento indefinido del gestor de ventanas.

La estructura SDL_Event tiene dos usos: La lectura de eventos de la cola de eventos se realiza mediante la función:
int SDL_PollEvent(SDL_Event *event);
Esta función busca nuevos elementos en la cola de eventos, devuelve 1 si existe algún evento pendiente y 0 si no hay ninguno.
Como argumento, se le pasa un puntero a un evento y si este es obtenido, se elimina de la cola.

Como en las aplicaciones se va a querer estar atendiendo eventos constantemente, se recomienda introducir los eventos en ciclos.
SDL_Event event;
.
.
while(SDL_PollEvent(&event))
  {
    if(event.type==SDL_KEYDOWN) printf(“Tecla presionada”);
  }
.
.
En este caso, se espera por un evento que proviene del teclado, si ocurre se imprime en pantalla el mensaje.

Manejo de teclado

Este se puede hacer mediante dos formas, la primera es mediante los eventos, y la otra es usar la función SDL_GetKeyState(), cuyo prototipo es:
Uint8 *SDL_GetKeyState(int *numkeys);
Esta función devuelve un puntero a un arreglo que contiene el estado de cada tecla. Un valor de 1 significa que la tecla esta presionada y 0 que no. El parámetro que toma corresponde al tamaño del arreglo. El arreglo está ordenado de acuerdo a SDLK_*, donde * coresponde a alguna tecla. Por ejemplo las teclas del cursor son:
SDLK_UP, SDLK_DOWN, SDLK_RIGHT, SDLK_LEFT;
Ahora se verá un ejemplo del uso de esta función. Supongase que se tiene un personaje en algun juego y y se desea moverlo al presionar las teclas de cursor. Suponiendo que se tienen dos variables, x e y, para almacenar la posición actual. Se tendrá lo siguiente:
Uint8 *key;
Uint16 x, y;
.
.
key=SDL_GetKeyState(NULL);
if(key[SDLK_UP]) y--;
if(key[SDLK_DOWN]) y++;
if(key[SDLK_RIGHT]) x++;
if(key[SDLK_LEFT]) x--;
.
.
Para el uso de teclado mediante manejo de eventos, se estudiará la estructura SDL_KeyboardEvent.
typedef struct{
    Uint8 type;
    Uint8 state;
    SDL_keysym keysym;
     }SDL_KeyboardEvent;
type: Donde se guarda el evento ocurrido, ya sea apretar o soltar una tecla, estos eventos son SDL_KEYDOWN o SDL_KEYUP.
state: Similar al anterior, indica el estado de la tecla. Los eventos son SDL_PRESSED o SDL_RELEASED.
keysym: Una estructura que almacena toda la información de la tecla presionada.

El contenido de las estructura keysym es el siguiente.
typedef struct{
    Uint8 scancode;
    SDLKey sym;
    SDLMod mod;
    Uint16 unicode;
     } SDL_keysym;
scancode: Es el código scan (scancode) que corresponde a los datos que envía el teclado al computador (su valor no depende de la tecla sino de su posición).
sym: símbolo virtual de la tecla (el que se entiende y el más usado).
mod: modificadores actuales de la tecla.
unicode: carácter en formato unicode, siempre y cuando la traducción unicode este habilitada.

Se usará el mismo ejemplo anterior pero administrado por eventos.
SDL_Event event;
Uint16 x, y;
.
.
while(SDL_Pollevent(&event))
  {
  if(event.type==SDL_KEYDOWN)
    {
    switch(event.key.keysym.sym)
      {
        case SDLK_UP : y--; break;
        case SDLK_DOWN : y++; break;
        case SDLK_RIGHT : x--; break;
        case SDLK_LEFT : x++; break;
      }
    }
}
.
.

[Anterior] Tabla De Contenido