top of page

 

La maîtrise du temps

 

La maîtrise du temps est obtenue par la fonction gesFrame() qui assure que le programme déroule en permanence une boucle principale avec une période fixe .

Cette fonction gesFrame() est placée à la fin de la boucle principale ( la boucle while(continuer) { …} ).

 

La dernière instruction de la fonction gesFrame() est donc la dernière instruction de la boucle principale ; c’est à cet instant que l’on mesure avec SDL_GetTicks() « tempsPrecedent ».

Cet instant « tempsPrecedent » représente l’instant où la boucle se termine c'est-à-dire aussi exactement l’instant ou la boucle suivante commence.

Intéressons nous à cette boucle suivante :

La boucle principale commence à l’instant de début = « tempsPrecedent ».

Ensuite une autre boucle commence, celle de traitement des évènements, qui sera plus ou moins longue en fonction du nombre d’évènements à traiter.

Puis l’on déroule les fonctions Actualise() et Affichage() ; elles aussi de durée variable.

Enfin on rentre dans la fonction gesFrame(), on arrive à la fin du code utile de la boucle principale et l’on mesure, toujours avec SDL_GetTicks(), cet instant = « tempsActuel ».

La différence entre « tempsActuel » et « tempsPrecedent » va nous donner la durée de la boucle. On rajoute un délai pour que cette durée soit constante et égale à t_frame = 20ms.

 

La durée de déroulement des instructions [ entre (tempsActuel – tempsPrecedent) plus la durée du délai SDL_Delay() ] est constante = t_frame = 20ms.

 

La durée de la boucle principale entre le début (ligne 299) et la fin (ligne 331) est donc constante : ce qui veut dire que toutes les instructions de cette boucle (toutes les instructions du programme en fait) sont appelées périodiquement avec un  intervalle (moyen) de 20ms.   

 

L’intérêt de cette périodicité est qu’il est très facile de mettre en place des vitesses de déplacement.

Si vous voulez, par exemple, qu’un objet traverse l’écran (1200 pixels) en une seconde ; alors pendant 20ms il faut augmenter sa position de (1200 / 1) x 0.020 soit 24 pixels.

Il suffira dans la fonction Actualise() de faire : position = position +24 ;

 

 

Dans la fonction Actualise() nous allons incrémenter systématiquement une variable « Time » qui représente le temps.

Il est alors très facile de prendre une date à instant particulier, exemple :

 

 T1 = Time ;

 

Et pour déclencher quelque chose par exemple 3s. après T1 :

 

if (Time > T1+ (3*50) ) { … }   //  50 fois 20ms en une seconde

  Page précédente                                                                                                                           Sommaire                                                                                                                       Page suivante

bottom of page