Le moteur de temps est.. terminé, ou du moins propose le minimum syndical pour gérer les problemes liés au temps dans les jeux.
Il se compose d'une seule fonction publique complétement simple:
void raydium_timecall_add(void *funct, GLint hz)
Le premier parametre (
funct) représente la fonction que vous souhaitez inscrire, et
hz la fréquence des appels.
Par exemple:
Code:
int cpt=0;
void toto(void) { cpt++; }
[...]
raydium_timecall_add(toto,900);
cpt est incrémenté "automatiquement" de 900 toutes les secondes (quel que soit la vitesse d'affichage du jeu et le nombre de passages dans la boucle d'affichage)
Il est aussi possible d'inscrire des fonctions avec des appels "élastiques", pour gérer une situation à chaque frame:
Code:
float cpt=0;
void toto(float step) { cpt+=step; }
[...]
raydium_timecall_add(toto,-60);
Vous voyez qu'ici le second argument est négatif, pour désigner un "softcall" (appel élastique, donc), et voici comment il faut lire ca:
"la fréquence normale d'appel de toto est de 60 Hz"
Mais cette fonction est appelée à chaque frame, sans conditions (c'est à dire 120 fois par seconde si le jeu tourne à 120 fps), mais avec un nouveau parametre (de type float donc) qui indique l'avance ou le retard sur la fréquence normale !
Par exemple, dans notre cas (toto est demandé à 60 Hz, et le jeu tourne à 120 fps), step est égal à 0.5 (on appelle 2 fois trop la fonction).
Cela permet d'avoir un mouvement fluide de qq chose à chaque frame même si la fréquence d'appel est faible, et d'avoir tout simplement une base de temps dans le programme.
Je ne sais pas si c'est bien clair, alors n'hésitez pas à poser des questions si cela vous intéresse.
Les sources sont à jour sur WVS.