Anuncios

Bienvenidos sean a este post, hoy veremos un tema particular que se utiliza en todos los juegos como son los frames por segundo.

Anuncios

Cuando comenzamos con el proyecto Juego, hemos utilizado una funcion llamada SDL_Delay para generar un pequeño retardo el cual hacia que nuestros movimientos sean mas sutiles pero hoy veremos como crear una forma de que nuestro juego corra con un ratio de frames fijos por segundo. Aunque un valor fijo de frames por segundo (fps) no siempre sea una buena opcion especialmente si tenemos una implememtacion de fisicas avanzadas, asi que tengan esto en mente cuando comiencen a desarrollar sus propios juegos.

Anuncios

Sin embargo, un fps fijo es una buena opcion para los pequeños juegos en 2D de este curso pero mas al final veremos como usar uno dinamico. Con todo esto aclarado procedamos a los cambios en nuestro proyecto. En caso de no poseerlo, les dejo un link para descargarlo:

Proyecto Juego

Anuncios

Descarguen el archivo y extraigan el contenido en el PC. Lo unico que deben hacer es revincular a SDL y SDL_Image. Para ello, les recomiendo este post donde comento como hacerlo para SDL y este otro post donde hago lo mismo para SDL_Image. Una vez que este todo funcionando correctamente, podemos continuar. Para nuestro primer paso debemos ir a main.cpp donde agregaremos un par de constantes al comienzo del archivo:

const int FPS = 60;
const int TIEMPO_DELAY = 1000.0f / FPS;
Anuncios

La primer constante define la cantidad de frames que veremos por segundo. La siguiente genera una demora en base a la division de 1000 por los fps, recuerden que la f es para indicar que es float, y esto es para determinar un retardo que no varia. Pero como dijimos antes con juegos simples no pasa nada aunque esto se vera afectado por el hardware del equipo donde lo ejecutemos mostrando distintas performances. Continuemos con las modificaciones y la siguiente sera dentro de la funcion main donde agregaremos estas variables:

Uint32 frame_inicio, tiempo_frame;
Anuncios

Estas son dos variables que usaremos para realizar los calculos necesarios, la siguiente modificacion sera en el bucle while que se ejecuta mientras esta corriendo, veamos como es el codigo actual:

while (Eljuego::instanciar()->corriendo()) {
	Eljuego::instanciar()->manejaEventos();
	Eljuego::instanciar()->actualizar();
	Eljuego::instanciar()->renderizar();
	SDL_Delay(10);
}
Anuncios

Este segmento lo modificaremos de la siguiente manera:

while (Eljuego::instanciar()->corriendo()) {
	frame_inicio = SDL_GetTicks();
	Eljuego::instanciar()->manejaEventos();
	Eljuego::instanciar()->actualizar();
	Eljuego::instanciar()->renderizar();
	tiempo_frame = SDL_GetTicks() - frame_inicio;
	if (tiempo_frame < TIEMPO_DELAY)
		SDL_Delay((int)(TIEMPO_DELAY - tiempo_frame));
}
Anuncios

Lo primero que haremos es establecer un valor para frame_inicio, mediante el valor obtenido con SDL_GetTicks. Seguimos usando las mismas funciones de antes pero despues establecemos el valor de tiempo_frame, mediante la diferencia del valor actual de SDL_GetTicks y el que almacenamos en frame_inicio. Lo siguiente sera un condicional donde verifica que tiempo_frame sea menor a TIEMPO_DELAY. En caso de ser verdadero procede a ejecutar SDL_Delay donde en lugar de informar un valor le pasamos el resultado de la diferencia entre TIEMPO_DELAY y tiempo_frame, y a este valor lo «convertimos» en int mediante el «casteo». Con esto tenemos una pequeña mejora de nuestro juego, compilemos y veamos como corre mediante el siguiente video

Anuncios

Como pueden ver obtuvimos el mismo resultado pero ahora podemos controlar de una mejor forma los retardos para nuestro juego.

Anuncios

En resumen, hoy hemos visto como es un fps de valor fijo, tambien existe de valor variable pero de esto hablaremos en otro momento, hemos visto como establecer los valores, como debimos modificar el bucle while encargado del ciclo del juego y como adaptarlo para nuestras necesidades. Espero les haya sido de utilidad y les dejo un link a GitHub donde estan los codigos creados hoy:

fps / GitHub

Les dejo algunas de mis redes sociales para seguirme o recibir una notificacion cada vez que subo un nuevo post:

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50