Control de tiempo en SDL

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

Control de tiempo en SDL

Notapor RafaG » Lun Abr 05, 2010 11:37 am

Hola, estoy haciendo un juego en C++ y SDL, y esta duda nunca la consigo responder, tengo un sprite compuesto por dos imágenes, en una imagen aparece el personaje con la pierna derecha adelantada y en la otra imagen aparece con la pierna izquierda adelantada, este personaje se puede mover cuando presionas la tecla W y lógicamente, su imagen cambia para que parezca que mueve las piernas. El caso es que no sé que tengo que hacer para que cuando el jugador mantenga presionada la tecla W halla un tiempo mínimo de espera entre una imagen y otra.

Para manejar el tiempo SDL nos da algunas funciones, pero ninguna me sirve, por ejemplo, SDL_Delay(x) no me sirve porque esta función no permitiría que el juego realizase otras operaciones, como mover a otros personajes. SDL_GetTicks() tampoco me sirve, y los timers tampoco me sirven.

He visto muchos juegos con sprites formados por dos imágenes, pero no veo cómo controlan el tiempo mínimo entre una imagen y otra.

A ver si me podéis decir como hacer lo que pido. Gracias.
RafaG
 
Mensajes: 20
Registrado: Lun Abr 05, 2010 10:57 am

Notapor Juanxo » Lun Abr 05, 2010 12:13 pm

buenas rafaG:

lo primero bienvenido a LosersJuegos. Vamos al lio:

para lo que pretendes hacer te puedes apañar casi con SDL_GetTicks().
Cada frame, antes de entrar en la parte de actualización del juego, puedes calcular el tiempo que ha pasado entre cada actualización:

Código: Seleccionar todo
tiempo_transcurrido = SDL_GetTicks() - inicio;
juego.actualizar(tiempo_transcurrido);
inicio = SDL_GetTicks();


dentro del actualizar, cada objeto tendra que tener alguna especie de contador e ir sumando el tiempo pasado en cada actualización. De esta manera, si el tiempo transcurrido es mayor que el tiempo entre cada animacion, cambiamos el sprite.

Otra manera más simple de conseguirlo sería que cada objeto tuviese un contador de actualizaciones, y cada vez que llamasemos a actualizar dicho objeto, el contador incrementase, y si llegase a un numero concreto(10 por ejemplo), cambiamos la imagen y el contador vuelve a 0.

Para resumir
Opcion 1
Código: Seleccionar todo
void Personaje::update(int tiempo_transcurrido)
{
    mContador += tiempo_transcurrido;
    if (mContador >= TIEMPO_ENTRE_IMAGENES)
    {
          SiguienteImagen();
          mContador = 0;
    }
}


Opcion 2
[code]
void Personaje::update()
{
mContador++;
if (mContador >= ACTUALIZACIONES_ENTRE_IMAGENES)
{
SiguienteImagen();
mContador = 0;
}
}

El ultimo método parece más simple, y es más rapido de implementar, pero el problema es que si el ordenador es más rapido, las imagenes cambiaran antes, si es más lento, las imagenes cambiaran mas tarde
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor RafaG » Lun Abr 05, 2010 12:39 pm

Ya pensé en SDL_GetTicks del modo que tu dices, pero no lo usé porque quizá haría el juego un poco más lento debido a la resta tiempo_transcurrido=SDL_GetTicks()-inicio, si los valores son muy grandes...

Pero si no queda otra, tendré que usar SDL_GetTicks().

Gracias.
RafaG
 
Mensajes: 20
Registrado: Lun Abr 05, 2010 10:57 am

Notapor Juanxo » Lun Abr 05, 2010 1:04 pm

el hecho de que los valores sean muy grandes no afecta al resultado:

si un int son 32 bits, son 32 bits siempre, por muy grande que sea, lo que pasa es que quizás te puedas salir de rango
Además tratar con long (que creo que son las variables que utiliza SDL_Ticks es a lo sumo 1 o 2 instrucciones, así que muy lento no es xD
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Mié Abr 07, 2010 4:55 pm

RafaG escribió: [...] no lo usé porque quizá haría el juego un poco más lento [...]


No te obsesiones con ese tipo de optimizaciones. Con SDL, la gran mayoría del tiempo, se está pintando la pantalla y resultarán insignificantes.

Te aconsejo que primero hagas cosas que funcionen y luego intentes optimizar las partes más lentas.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron