Borrar cola de eventos en SDL

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Borrar cola de eventos en SDL

Notapor migueleitorone » Mié Abr 27, 2011 9:56 pm

Buenas que tal?
Tengo un problemilla con el tema de los eventos y diria que la solucion es borrar la cola de eventos, me explico:
El programa en el que estoy trabajando es algo asi:
int i = 0;
while(!done)
{
SDL_WaitEvent(&evento);
if(botonPulsado)
{
imagenAnimacion = listaImagenesAnimacion[i];
i++;
if(i == ultimoNumeroAnimacion) i = 0;
}
//Demas eventos a manipular
SDL_BlitSurface(imagenAnimacion, NULL, screen, rect);
//Demas imagenes a actualizar en la pantalla
}


El problema que tengo es que la animacion no se ejecuta si no hay eventos(el loop no avanza por que se queda esperando al evento?).
He probado usando SDL_PollEvent() y la animacion funciona sin problemas, pero me surge otro problema, si pulso una tecla se almacenan varias pulsaciones(supongo que tiene que ver con el tiempo que pase la tecla pulsada).
He probado tambien añadiendo while(SDL_PollEvent(&evento)) {} despues de manipular los eventos y tampoco funciona.

Que puedo hacer para que funcione la animacion y no se repitan las pulsaciones de las teclas?
gracias de antemano:D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Borrar cola de eventos en SDL

Notapor Juanxo » Mié Abr 27, 2011 10:22 pm

buenas miguel:

La verdad es que tu duda me deja un poco confuso. Puedes elaborar un poco más?

botonPulsado:
- Qué botón?
- con pulsado te refieres a PRESSED, RELEASED, es decir, pulsar y soltar, al pulsar, al soltar?
- igual el problema es que tienes habilitado algo que se llamaba SDL_KeyRepeat, porque en teoría si pulsas una tecla solo debería generar un evento

Además, me parece que la forma en la que lo estás organizando no es la más adecuada

while( SDL_PollEvent(&event))
{
if (event.type == SDLK_LEFT)
avanzarFrame()
}

drawFrame()


yo lo he hecho así las veces que he tenido que hacer algo del estilo.

Por favor, explica que pretendes hacer un poco más detallado y seguro que sacamos algo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Borrar cola de eventos en SDL

Notapor migueleitorone » Jue May 12, 2011 9:29 pm

buenas, lo siento por responder tan tarde pero he estado liado y no he tenido tiempo de ponerme a programar, te aclaro:
con boton pulsado me referia a un boton que yo mismo he programado(como el boton de minimizar o el de cerrar una ventana), la verdad es que no era muy claro el ejemplo que te he puesto :P.

El codigo es una animacion que muestra una imagen diferente en cada pasada del while, el problema es que para que la animacion se ejecute el programa tiene que recibir algun evento, sino se queda esperandolo y no avanza el while(creo que es eso, no estoy muy seguro jeje).
int i = 0;
while(!done)
{
SDL_WaitEvent(&evento);
if(condicion)
{
imagenAnimacion = listaImagenesAnimacion[i];
i++;
if(i == ultimoNumeroAnimacion) i = 0;
}
//Demas eventos a manipular
SDL_BlitSurface(imagenAnimacion, NULL, screen, rect);
//Demas imagenes a actualizar en la pantalla
}


Otra cosilla, el ejemplo que me has dado para organizar el codigo tendria que usarlo dentro del game loop no(no se si se llamara game loop en un programa que no sea un juego), algo asi no?

while(!done)
{
while( SDL_PollEvent(&event))
{
if (event.type == SDLK_LEFT) done = true;
}
actualizarPantalla();
}


gracias juanxo por la ayuda :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Borrar cola de eventos en SDL

Notapor Geo » Mié May 18, 2011 5:56 am

No necesitas limpiar la cola de eventos, tu programa se detiene en espera de un evento porque tú le has indicado que lo haga, usando la función SDL_WaitEvent, en una aplicación que pretendes actualizar a cada momento no puedes detener el programa de esa forma, deberías en su lugar dejar que el programa corra siempre y reaccionar cuando ocurre el evento que deseas.

while(!done)
{
while( SDL_PollEvent( &evento ) )
{
// Aquí actualizas lo necesario de acuerdo a la entrada del usuario
// pulsación de teclado, botón del ratón, etc.
}

// Aquí ejecutas la lógica de tu programa
if( condicion && pasoTiempoSuficiente )
{
actualizarImagen();
}

// Dibujar
SDL_BlitSurface( imagenAnimacion, NULL, screen, rect );
}

El primer ciclo while permite recorrer los eventos ocurridos que están en espera y reaccionar ante ellos. Pero el programa no se detiene allí, ya que inmediatamente después de atender los eventos continúa. En el ejemplo que te pongo, después de evaluar los eventos pendientes, se actualiza el índice de la imagen que deseas dibujar, aquí agrego una variable pasoTiempoSuficiente que se pondría en verdadero cuando haya pasado el tiempo deseado entre transiciones de imágenes, de manera que puedas controlar la velocidad a la que se cambia la imagen.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Re: Borrar cola de eventos en SDL

Notapor migueleitorone » Mié May 18, 2011 11:29 pm

Gracias geo,
ya he probado usando SDL_PollEvent() y la animacion se jecuta perfectamente, el problema es que a la hora de escribir algo(en un campo de texto del programa) me pilla varias pulsaciones de tecla, si intento escribir hola lo que es escribo es hhhhhhhhhhooooolllllllaaaaaa, por eso estaba usando SDL_WaitEvent().
Voy a hechar un ojo por google sobre el SDL_KeyRepeat que me ha dicho Juanxo, cualquier cosa me paso por aqui, gracias a los dos :))))
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Borrar cola de eventos en SDL

Notapor migueleitorone » Jue May 19, 2011 11:58 pm

buenas, por lo que estoy leyendo, usando la funcion SDL_EnableKeyRepeat(0,0); al principio de mi codigo, despues de iniciar SDL se tendria que desactivar el keyRepeat pero no se por que no me funciona :S, he probado con otros valores y tampoco cambia nada, tambien con los deafult(SDL_DEFAULT_REPEAT_DELAY y SDL_DEFAULT_REPEAT_INTERVAL) y nada .
La funcion devuelve 0, y segun la wiki de sdl si devulve 0 esque todo a ido bien.

Estoy haciendo algo mal?
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado