Capítulo 1. Eventos

Tabla de contenidos
1.1. ¿Cómo trabajar con eventos?
1.2. Un ejemplo de manejo de eventos de teclado

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.

1.1. ¿Cómo trabajar con eventos?

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:

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.

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.