Curso de introducción a videojuegos multiplataforma con SDL
Curso de introducción a videojuegos multiplataforma con SDL
Curso de introducción a videojuegos multiplataforma con SDL
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos<br />
<strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Subsistema <strong>de</strong> Eventos<br />
Bruno González y Pablo Orduña<br />
-aka StenyaK y NcTrunstenyak@gmx.net<br />
- pablo@ordunya.com<br />
http://kwh.iespana.es<br />
Julio 2004 – e-ghost<br />
ESIDE – Universidad <strong>de</strong> Deusto<br />
This work is licensed un<strong>de</strong>r the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit<br />
http://creativecommons.org/licenses/by-nc-sa/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Introducción<br />
● La <strong>SDL</strong> nos proporciona un subsistema<br />
<strong>de</strong> eventos<br />
– Con él, podremos manejar <strong>con</strong> facilidad el<br />
ratón y teclado (entre otros)<br />
● Este subsistema se inicializa <strong>de</strong> manera<br />
automática <strong>con</strong> la inicialización <strong>de</strong> la<br />
librería<br />
– <strong>SDL</strong>_Init(); //no hace falta ningún flag<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Eventos - I<br />
● Como dijimos en la <strong>introducción</strong>, el<br />
subsistema <strong>de</strong> Joystick (y trackball...) es<br />
in<strong>de</strong>pendiente<br />
– Tiene sus propias funciones in<strong>de</strong>pendientes<br />
– Sin embargo, la gestión <strong>de</strong> los eventos<br />
producidos pue<strong>de</strong> ser incluida en este<br />
subsistema<br />
● También manejaremos los eventos<br />
producidos por el gestor <strong>de</strong> ventanas<br />
● También manejaremos “eventos<br />
especiales”<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Eventos - II<br />
● Un “evento” será un <strong>SDL</strong>_Event<br />
– Este tipo es una unión que tendrá:<br />
● Un dato “Uint8 type”, que nos indicará el tipo<br />
<strong>de</strong> evento<br />
● Uno <strong>de</strong> los posibles tipos <strong>de</strong> datos <strong>de</strong><br />
diferentes eventos (<strong>SDL</strong>_KeyboardEvent,<br />
<strong>SDL</strong>_MouseMotionEvent...)<br />
– Es una unión, por lo que sólo se almacena<br />
uno <strong>de</strong> los datos.<br />
● Pero todos los posibles tipos <strong>de</strong> datos <strong>de</strong><br />
diferentes eventos tienen como primer dato un<br />
“Uint8” -> <strong>con</strong> ev.type sabemos el tipo.<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Eventos - III<br />
Definición <strong>de</strong> <strong>SDL</strong>_Event:<br />
type<strong>de</strong>f union{<br />
Uint8 type;<br />
<strong>SDL</strong>_ActiveEvent active;<br />
<strong>SDL</strong>_KeyboardEvent key;<br />
<strong>SDL</strong>_MouseMotionEvent motion;<br />
<strong>SDL</strong>_MouseButtonEvent button;<br />
<strong>SDL</strong>_JoyAxisEvent jaxis;<br />
<strong>SDL</strong>_JoyBallEvent jball;<br />
<strong>SDL</strong>_JoyHatEvent jhat;<br />
<strong>SDL</strong>_JoyButtonEvent jbutton;<br />
<strong>SDL</strong>_ResizeEvent resize;<br />
<strong>SDL</strong>_ExposeEvent expose;<br />
<strong>SDL</strong>_QuitEvent quit;<br />
<strong>SDL</strong>_UserEvent user;<br />
<strong>SDL</strong>_SywWMEvent syswm;<br />
} <strong>SDL</strong>_Event;<br />
(Explicamos más a<strong>de</strong>lante cada punto)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – teclado - I<br />
● De teclado (<strong>SDL</strong>_KeyboardEvent)<br />
– Tiene 3 datos:<br />
1)Uint8 type: <strong>SDL</strong>_KEYDOWN o <strong>SDL</strong>_KEYUP (si<br />
ha pulsado o soltado una tecla)<br />
2)Uint8 state: <strong>SDL</strong>_PRESSED o<br />
<strong>SDL</strong>_RELEASED (redundante)<br />
3)<strong>SDL</strong>_keysym keysym: Con lo que sabemos qué<br />
tecla <strong>con</strong>creta ha pulsado<br />
– Tiene 4 datos:<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
1)Uint8 scanco<strong>de</strong>: código específico <strong>de</strong>l hardware<br />
2)<strong>SDL</strong>Key sym: tecla pulsada<br />
3)<strong>SDL</strong>Mod mod: modificadores pulsados (shift...)<br />
4)Uint16 unico<strong>de</strong>: el carácter UNICODE<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – teclado - II<br />
Ejemplo:<br />
void procesaEvento(<strong>con</strong>st <strong>SDL</strong>_Event& evento)<br />
{<br />
switch(evento.type){<br />
case <strong>SDL</strong>_KEYDOWN:<br />
if(evento.key.keysym.sym == <strong>SDL</strong>_K_a<br />
&& evento.key.keysym.mod & <strong>SDL</strong>_RCTRL)<br />
std::cout
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – teclado -<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
III<br />
● Como vemos, los valores <strong>de</strong> sym son<br />
<strong>con</strong>stantes tipo <strong>SDL</strong>K_a, o<br />
<strong>SDL</strong>K_LEFT...<br />
● En el campo mod, se pue<strong>de</strong>n poner<br />
varios a la vez mediante ORs<br />
● Adjuntamos “cod_teclas.html” <strong>con</strong><br />
todos los códigos<br />
● Para hacer uso <strong>de</strong> caracteres Unico<strong>de</strong>,<br />
hay que especificarlo previamente<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – ratón - I<br />
● Para <strong>con</strong>trolar el ratón hay dos tipos <strong>de</strong><br />
eventos:<br />
– <strong>SDL</strong>_MouseMotionEvent<br />
● Se activa al mover el ratón<br />
● Datos:<br />
– Uint8 type (siempre <strong>SDL</strong>_MouseMotionEvent)<br />
– Uint8 state (estado <strong>de</strong> las teclas)<br />
● Es igual que el estado en <strong>SDL</strong>_MouseButtonEvent,<br />
que se explica en la siguiente transparencia<br />
– Uint16 x,y (posición actual <strong>de</strong>l cursor)<br />
– Uint16 xrel, yrel (movimiento <strong>de</strong>l ratón)<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – ratón - II<br />
– <strong>SDL</strong>_MouseButtonEvent<br />
● Se activa cuando se pulsa una tecla <strong>de</strong>l ratón<br />
● Datos:<br />
– Uint8 type (siempre <strong>SDL</strong>_MouseButtonEvent)<br />
– Uint8 button (qué botón ha provocado el evento)<br />
● Una OR <strong>de</strong>:<br />
● <strong>SDL</strong>_BUTTON_LEFT<br />
● <strong>SDL</strong>_BUTTON_RIGHT<br />
● <strong>SDL</strong>_BUTTON_MIDDLE<br />
– Uint8 state (si se ha pulsado o se ha soltado)<br />
● <strong>SDL</strong>_PRESSED o <strong>SDL</strong>_RELEASED<br />
– Uint16 x,y (en qué posición está el ratón)<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Tipos <strong>de</strong> eventos – ratón - III<br />
Ejemplo:<br />
void procesarEvento(<strong>con</strong>st <strong>SDL</strong>_Event& evento){<br />
switch(evento.type){<br />
case <strong>SDL</strong>_MouseMotionEvent:<br />
std::cout
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Cola <strong>de</strong> eventos - I<br />
● El Sistema Operativo almacena una<br />
serie <strong>de</strong> eventos dirigidos a nuestro<br />
programa<br />
● La <strong>SDL</strong> cuenta <strong>con</strong> una cola interna<br />
para almacenarlos<br />
● Cada cierto tiempo, nosotros pediremos<br />
a la <strong>SDL</strong> que actualice su cola <strong>con</strong> lo<br />
que haya ocurrido <strong>de</strong>s<strong>de</strong> la última<br />
actualización<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Cola <strong>de</strong> eventos - II<br />
● Para acce<strong>de</strong>r a la cola <strong>de</strong> eventos, lo<br />
que haremos será:<br />
– Actualizarla <strong>con</strong> respecto al SO<br />
– Ir tomando eventos <strong>de</strong> la cola<br />
● Para actualizarla, haremos una llamada<br />
simple a:<br />
– void <strong>SDL</strong>_PumpEvents();<br />
– No se suele hacer, porque su función está<br />
<strong>con</strong>tenida implícitamente en otras<br />
funciones.<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Cola <strong>de</strong> eventos - III<br />
● Para tomar el primer evento <strong>de</strong> la cola,<br />
se llama a la función:<br />
– int <strong>SDL</strong>_PollEvent(<strong>SDL</strong>_Event *ev);<br />
● Esta función llama primero a<br />
<strong>SDL</strong>_PumpEvents<br />
● Si ev es distinto <strong>de</strong> 0, almacena en su<br />
dirección el primer evento que haya en cola, y<br />
lo elimina <strong>de</strong> la misma.<br />
● Si ev es igual a 0, ni almacena ni elimina dicho<br />
evento<br />
● Devolverá 1 si hay eventos pendientes en la<br />
cola, y 0 en caso <strong>con</strong>trario<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Ejemplo:<br />
Cola <strong>de</strong> eventos - IV<br />
void actualizarPosicion(void)<br />
{<br />
<strong>SDL</strong>_Event evento;<br />
while(<strong>SDL</strong>_PollEvent(&evento))<br />
procesarEvento(evento);<br />
}<br />
● Con esto procesamos todos los eventos<br />
que haya en cola hasta haber procesado<br />
todos los que se han dado mientras<br />
haciámos otra cosa<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Otro ejemplo:<br />
Cola <strong>de</strong> eventos - V<br />
void hazAlgo()<br />
{<br />
bool fin = false;<br />
while (!fin){<br />
<strong>SDL</strong>_Event evento;<br />
<strong>SDL</strong>_PollEvent(&evento);<br />
switch(evento.type){<br />
case <strong>SDL</strong>_KEYDOWN:<br />
if (evento.key.keysym.sym == <strong>SDL</strong>K_ESCAPE)<br />
fin = true;<br />
if(evento.key.keysym.sym == <strong>SDL</strong>K_a)<br />
std::cout
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Cola <strong>de</strong> eventos - VI<br />
● Pero este código no mola mucho:<br />
– Hay un bucle que termina cuando pulsas la<br />
tecla q, y que muestra un mensaje cuando<br />
pulsas la tecla a<br />
– El tema está en que en este caso <strong>con</strong>creto<br />
(al igual que por ejemplo en juegos por<br />
turnos), te interesa simplemente “esperar”<br />
a que haya un evento, y no tienes por qué<br />
<strong>de</strong>sperdiciar tanta CPU como estamos<br />
haciendo en el ejemplo<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Cola <strong>de</strong> eventos - VII<br />
● Soluciones:<br />
– int <strong>SDL</strong>_WaitEvent(<strong>SDL</strong>_Event *ev);<br />
● Simplemente, espera a q haya algo en la cola y<br />
no hace nada mientras (sólo útil a veces)<br />
● Al igual que <strong>SDL</strong>_PollEvent, si su parámetro es<br />
distinto <strong>de</strong> cero se almacena el evento y se<br />
borra <strong>de</strong> la cola, y si es cero, no se almacena<br />
ni se borra.<br />
– void <strong>SDL</strong>_Delay(Uint32 ms);<br />
● Espera los milisegundos que se le pasa como<br />
parámetro<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Utilizando los eventos - I<br />
● Un evento sólo se produce cuando algo<br />
cambia<br />
● Pulsar una tecla y mantenerla produce<br />
únicamente 1 evento al pulsarla y otro<br />
cuando se <strong>de</strong>je <strong>de</strong> pulsar<br />
● Por tanto en principio se <strong>de</strong>be hacer<br />
uso <strong>de</strong> flags o variables <strong>de</strong> velocidad<br />
para que, al mantener una tecla<br />
pulsada, siga manteniéndose una<br />
acción (pulsar izqda y q siga<br />
moviéndose)<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Utilizando los eventos - II<br />
● Aunque lo anterior sea lo más usado al<br />
ser lo más cómodo, existen dos<br />
alternativas:<br />
– int <strong>SDL</strong>_EnableKeyRepeat(int espera, int<br />
intervalo)<br />
● Si <strong>de</strong>lay = 0, se <strong>de</strong>shabilita<br />
● si <strong>de</strong>lay != 0, a partir <strong>de</strong> “espera”<br />
milisegundos, cada “intervalo” milisegundos,<br />
se produce un nuevo evento <strong>de</strong> tipo<br />
<strong>SDL</strong>_KEYDOWN sin necesidad <strong>de</strong> soltar y<br />
volver a pulsar<br />
● Con <strong>SDL</strong>_WaitEvent (<strong>SDL</strong>_PollEvent no<br />
respeta los intervalos y esperas)<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Utilizando los eventos - III<br />
– Uint8 *<strong>SDL</strong>_GetKeyState(int * numTeclas);<br />
● Esta función <strong>de</strong>vuelve el estado actual <strong>de</strong>l<br />
teclado.<br />
● Devuelve un array <strong>de</strong> (*numTeclas) posiciones<br />
● Las posiciones están in<strong>de</strong>xadas por código <strong>de</strong><br />
la tecla (<strong>SDL</strong>K_a, etc)<br />
● Una posición a 1 significa que está pulsada, a<br />
0 significa que no<br />
● Para ir actualizando este array, tendremos que<br />
llamar a <strong>SDL</strong>_PumpEvents();<br />
● IMPORTANTE: No liberar el valor <strong>de</strong>vuelto<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Utilizando los eventos - IV<br />
Ejemplo:<br />
Uint8 * estadoTeclado = <strong>SDL</strong>_GetKeyState(0);<br />
if (estadoTeclado[<strong>SDL</strong>K_a])<br />
std::cout
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
Otros eventos<br />
● Hasta ahora hemos visto eventos <strong>de</strong><br />
teclado y ratón, que son los más<br />
utilizados<br />
● Sin embargo, también pue<strong>de</strong>n resultar<br />
interesantes los eventos <strong>de</strong>l gestor <strong>de</strong><br />
ventanas y <strong>de</strong>l Joystick (este último no<br />
vamos a verlo)<br />
● También veremos los eventos que<br />
nosotros provocaremos<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos <strong>de</strong>l gestor <strong>de</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
ventanas - I<br />
● Nuestro programa pue<strong>de</strong> estar en:<br />
– modo pantalla completa<br />
– una ventana.<br />
● En caso <strong>de</strong> estar en una ventana,<br />
interactuará <strong>con</strong> el gestor <strong>de</strong> ventanas<br />
<strong>con</strong> diferentes eventos, ya que pue<strong>de</strong>:<br />
– que el usuario <strong>de</strong>cida cambiar el tamaño <strong>de</strong><br />
la ventana<br />
– que el usuario <strong>de</strong>cida cerrar la ventana<br />
– que el usuario <strong>de</strong>cida cambiar <strong>de</strong> ventana<br />
– etc<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos <strong>de</strong>l gestor <strong>de</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
ventanas - II<br />
● Para que el usuario cambie el tamaño<br />
<strong>de</strong> la ventana, <strong>de</strong>bemos haber indicado<br />
que queremos que pueda:<br />
– Al llamar a <strong>SDL</strong>_SetVi<strong>de</strong>oMo<strong>de</strong>, tendremos<br />
que haber pasado el flag <strong>SDL</strong>_RESIZABLE<br />
● Al cambiar, producirá un <strong>SDL</strong>_Event<br />
cuyo type será <strong>SDL</strong>_ResizeEvent, y<br />
tendrá dos atributos w y h, que serán la<br />
altura y anchura actualizados.<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos <strong>de</strong>l gestor <strong>de</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
ventanas - III<br />
● Si el usuario intenta cerrar la ventana:<br />
– la <strong>SDL</strong> lo traduce a un <strong>SDL</strong>_Event cuyo<br />
type es <strong>SDL</strong>_QUIT.<br />
– Será un <strong>SDL</strong>_QuitEvent, pero no tendrá<br />
ningún dato salvo el campo type<br />
● La <strong>SDL</strong> también traduce a eventos el<br />
que el ratón esté o no encima <strong>de</strong> la<br />
ventana <strong>de</strong>l programa, o que el usuario<br />
esté mirando otra ventana.<br />
– Para ello está el <strong>SDL</strong>_ActiveEvent<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos <strong>de</strong>l gestor <strong>de</strong><br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
ventanas - IV<br />
● El <strong>SDL</strong>_ActiveEvent tiene 3 datos:<br />
– Uint8 type (siempre <strong>SDL</strong>_ACTIVEEVENT)<br />
– Uint8 gain (1 = gana, 0 = pier<strong>de</strong>)<br />
– Uint8 state (<strong>SDL</strong>_APPMOUSEFOCUS es si<br />
el ratón apunta o no a la ventana,<br />
<strong>SDL</strong>_APPINPUTFOCUS es si la ventana<br />
activa es la <strong>de</strong> nuestro programa)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos generados por el<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
programador - I<br />
● En <strong>de</strong>terminados casos, pue<strong>de</strong> sernos<br />
<strong>de</strong> utilidad generar nosotros un evento<br />
cuando ocurra algo, para que algo se<br />
produzca.<br />
● La forma más “lógica” <strong>de</strong> añadir un<br />
evento a la cola es utilizando la función:<br />
– int <strong>SDL</strong>_PushEvent(<strong>SDL</strong>_Event *ev);<br />
● Primero <strong>de</strong>finimos un evento, y luego<br />
simplemente lo añadimos al final <strong>de</strong> la cola.<br />
● Retorna 0 si ha podido o -1 si no.<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos generados por el<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
programador - II<br />
● Otra forma <strong>de</strong> manejar la cola <strong>de</strong><br />
eventos es la función<br />
– int <strong>SDL</strong>_PeepEvents(<strong>SDL</strong>_Event* evs, int<br />
numEvs, <strong>SDL</strong>_eventaction ac,Uint32 masc);<br />
● don<strong>de</strong> evs es un array <strong>de</strong> “<strong>SDL</strong>_Event”s<br />
● numEvs es el número <strong>de</strong> eventos <strong>con</strong>tenidos<br />
en el array<br />
● ac es un enumerado que pue<strong>de</strong> ser:<br />
– <strong>SDL</strong>_ADDEVENT: introducirá los eventos <strong>de</strong>l array en<br />
la cola<br />
– <strong>SDL</strong>_PEEKEVENT: introducirá en el array numEvs<br />
eventos, sin borrarlos <strong>de</strong> la cola <strong>de</strong> la <strong>SDL</strong><br />
– <strong>SDL</strong>_GETEVENT: lo anterior, pero borrándolos<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Eventos generados por el<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
programador - III<br />
● masc es una especie <strong>de</strong> “filtro” para elegir<br />
sólo unos <strong>de</strong>terminados tipos <strong>de</strong> eventos<br />
– se eligen <strong>con</strong> ORs, el resultado <strong>de</strong> la macro<br />
<strong>SDL</strong>_EVENTMASK(tipoEvento);<br />
● Por último, el introducir un evento <strong>de</strong><br />
ratón para posicionarlo en un sitio<br />
<strong>con</strong>creto se facilita <strong>con</strong> la función:<br />
– void <strong>SDL</strong>_WarpMouse(Uint16 x, Uint16 y);<br />
● Introduce un evento <strong>con</strong> el que el ratón se<br />
posiciona en la posición (x,y)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Filtrado <strong>de</strong> eventos - I<br />
● Para terminar <strong>con</strong> el subsistema <strong>de</strong><br />
eventos, comentar que po<strong>de</strong>mos aplicar<br />
filtrados a los mismos<br />
● En un juego, <strong>de</strong>pendiendo <strong>de</strong>l mismo,<br />
nos interesará escuchar únicamente<br />
eventos que cumplan unas <strong>con</strong>diciones<br />
<strong>con</strong>cretas.<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Filtrado <strong>de</strong> eventos - II<br />
● Po<strong>de</strong>mos <strong>de</strong>finir una función tal que:<br />
– int miFuncion(<strong>con</strong>st <strong>SDL</strong>_Event * ev);<br />
● que <strong>de</strong>vuelva 1 cuando queramos que se<br />
incluya en la cola<br />
● que <strong>de</strong>vuelva 0 cuando NO queremos que sea<br />
incluida.<br />
● Y luego establecerla como filtro <strong>con</strong>:<br />
– void <strong>SDL</strong>_SetEventFilter(<strong>SDL</strong>_EventFilter filtro);<br />
– type<strong>de</strong>f (*<strong>SDL</strong>_EventFilter)(<strong>con</strong>st <strong>SDL</strong>_Event*ev);<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto
<strong>Curso</strong> <strong>de</strong> <strong>introducción</strong> a vi<strong>de</strong>ojuegos <strong>multiplataforma</strong> <strong>con</strong> <strong>SDL</strong><br />
Filtrado <strong>de</strong> eventos - II<br />
● De esta manera, po<strong>de</strong>mos hacer algo tal<br />
que:<br />
int filtro(<strong>con</strong>st <strong>SDL</strong>_Event*ev)<br />
{<br />
}<br />
//...<br />
return ev.type == <strong>SDL</strong>_KEYDOWN || ev.type == <strong>SDL</strong>_KEYUP;<br />
<strong>SDL</strong>_SetFilter(filtro);<br />
//...<br />
– Pue<strong>de</strong> resultarnos útil para asegurarnos que no<br />
procesamos / almacenamos <strong>con</strong> PeepEvents<br />
eventos que no sean otra cosa que teclado.<br />
© 2004 – Bruno González (STenyaK)<br />
Pablo Orduña (NcTrun)<br />
e-ghost – ESIDE – Universidad <strong>de</strong> Deusto