› Foros › Multiplataforma › Desarrollo
kbks escribió:La estructura de practicamente todos los juegos es la siguiente:
inicialización();
while(seguir)
{
logica();
render();
}
A eso me refiero con el bucle del juego, al bucle que al final es el que marca los fps de la aplicación. Glut hace esto mediante la función glutMainLoop() , en la que detecta los eventos del sistema y va llamando a las diferentes funciones callback que has definido anteriormente pasandole a glut un puntero a dichas funciones (por ejemplo la función de dibujado con glutDisplayFunc(), o cuando detecta un evento de teclado la que definas con la glutKeyboardFunc() creo que se llama). Lo que suele hacer la gente cuando trabaja con glut es definir la misma función para render(glutDisplayFunc()) que para cuando glut no hace nada (glutIdleFunc() creo que es) y meter ahí primero la lógica del juego y depues el render. De esa manera creo que te aseguras que se va a ejecutar una vez cada frame, aunque no me hagas mucho caso porque solo he utilizado esto para hacer demos gráficas con una carga mínima de lógica. Igual los que programan juegos con glut lo hacen de otra manera.
De todos modos para entender esto mejor deberías intentar hacer un juego sin Glut (algo sencillo, una ventana en SDL con una imagen estática vale) para que veas que es lo que hace glut por detras, ya que no es mas que un bucle que recoge eventos y llama a las funciones que tu le dices que tiene que llamar para cada evento.
Por cierto, glutPostRedisplay() no redibuja, lo que hace es decir a glut que llame cuanto antes a la función que le mandas en glutDisplayFunc() para que refresque la pantalla.
#define FPS 60
#define NEXTFRAMELAPSE 1000/FPS //cuantos milisegundos entre frames?
#define MAXFRAMESKIP 20 //estoy dispuesto a saltarme 20 frames si no me da tiempo, pero ni uno mas
next_frame=get_current_milisec()+NEXTFRAMELAPSE; //no recuerdo con exactitud la funcion exacta, pero creo que se entiende
frame_skip=0;
while(1)
{
if(get_current_milisec()>next_frame) //o sea, nos toca trabajar?
{
next_frame=next_frame+NEXTFRAMELAPSE; //para saber cuando nos tocara currar de nuevo
update_logica(); //la logica la tenemos que actualizar por cojones
if (get_current_milisec()>next_frame && frame_skip<MAXFRAMESKIP)
{
//si entramos aqui, es que no nos da tiempo a dibujar porque ya deberiamos estar en el otro frame
//y ademas, aun estamos dentro de los frames permitidos que nos podemos 'comer'
frame_skip++;
}
else
{
//si entramos aqui, o bien aun estamos en tiempo de dibujar, o bien tenemos que plantar un frame por cojones
render();
frame_skip=0;
}
}
}