08.05.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!