[Anterior] Tabla de Contenidos
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{A continuación se detalla cada una de las definiciones:
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;
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:• Lectura de eventos de la cola de eventos.
La lectura de eventos de la cola de eventos se realiza mediante la función:
• Inserción de eventos en la cola de eventos.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;En este caso, se espera por un evento que proviene del teclado, si ocurre se imprime en pantalla el mensaje.
.
.
while(SDL_PollEvent(&event))
{
if(event.type==SDL_KEYDOWN) printf(“Tecla presionada”);
}
.
.
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;Para el uso de teclado mediante manejo de eventos, se estudiará la estructura SDL_KeyboardEvent.
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--;
.
.
typedef struct{type: Donde se guarda el evento ocurrido, ya sea apretar o soltar una tecla, estos eventos son SDL_KEYDOWN o SDL_KEYUP.
Uint8 type;
Uint8 state;
SDL_keysym keysym;
}SDL_KeyboardEvent;
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{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).
Uint8 scancode;
SDLKey sym;
SDLMod mod;
Uint16 unicode;
} SDL_keysym;
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;
}
}
}
.
.