il dise sa sur le site:
"
Si vous programmez des jeux, il vous est déjà sûrement arrivé de voir un jeu tourner à une vitesse parfaite sur votre ordinateur, mais trop lentement ou trop rapidement sur un autre. La solution est d´utiliser un timer.
Vous devez tout d´abord diviser votre code en 2 parties :
La boucle " logique" ( qui déplace les sprites, détecte les collisions...)
La boucle " graphique" ( qui affiche tout sur l´écran)
Pour que la vitesse d´un jeu soit constante quel que soit l´ordinateur, il faut que la boucle logique soit exécutée en priorité ( car c´est elle qui gère toutes les données), et ce un certain nombre de fois par secondes.
Quant à la boucle graphique, elle sera exécutée à chaque fois qu´on le pourra : c´est à dire souvent sur un ordinateur rapide, et moins souvent sur un ordinateur moins rapide.
Voilà à quoi doit ressembler votre code :
volatile int target_game_time = 0;
void increment_target_game_time()
{
target_game_time++;
}
END_OF_FUNCTION(increment_target_game_time);
int play_game()
{
int actual_game_time = 0, ok_to_draw = TRUE;
LOCK_VARIABLE(target_game_time);
LOCK_FUNCTION(increment_target_game_time);
install_int_ex(increment_target_game_time, BPS_TO_TIMER(50));
while(!done)
{
while(actual_game_time < target_game_time)
{
logic_loop();
actual_game_time++;
ok_to_draw = TRUE;
}
if(ok_to_draw)
{
graphics_loop();
ok_to_draw = FALSE;
}
}
remove_int(increment_target_game_time);
return 0;
}
Commentaires :
Les variables et fonctions relatives au timer doivent être verrouillées, d´où l´utilisation des macros LOCK_VARIABLE() et LOCK_FUNCTION().
La fonction ´install_int_ex()´ installe un timer de telle manière que le fonction ´increment_target_game_time()´ sera appelée 50 fois par seconde.
La variable ´target_game_time´ est un compteur, qui est incrémenté par ´increment_target_game_time()´. A tout moment, il indique combien de fois le programme devrait avoir exécuté la boucle logique ( "logic_loop()").
La variable ´actual_game_time´ est aussi un compteur, qui est incrémenté à chaque exécution de la boucle logique ( "logic_loop()"). Il permet donc de mesurer le nombre d´exécutions de cette boucle.
Comme vous pouvez le voir, tout se joue à travers les variables ´actual_game_time´ et ´target_game_time´ : la première " essaie" de rattraper la seconde. Si elle y parvient, la boucle graphique est exécutée.
La variable ´ok_to_draw´ sert uniquement à empêcher le programme d´exécuter la boucle graphique 2 fois de suite ( ou plus) : cela ne servirait à rien car rien n´aurait eu le temps de bouger sur l´écran.
"