===== Allegro — Timers =====
Dans cet article nous étudions les Timers, et comment les utiliser pour réguler notre boucle d'affichage.
==== Que sont les Timers? ====
Ce sont des sources d'events qui déclenche un event sur un intervalle de temps régulier.
==== Pourquoi en ai-je besoin ====
Ils peuvent être utilisés pour mettre à jour la boucle principale de votre jeu, ce qui vous permet de tourner à un certain FPS, ou ils peuvent être utilisés pour savoir quand une animation à besoin d'être mise à jour, etc. 
==== Exemple basique ====
Construit à partir de l'[[allegro:events#Basic_Example|exemple précédent]] afin d'avoir une fréquence d'update stable.
#include 
#include 
const float FPS = 60;
int main(int argc, char **argv)
{
   ALLEGRO_DISPLAY *display = NULL;
   ALLEGRO_EVENT_QUEUE *event_queue = NULL;
   ALLEGRO_TIMER *timer = NULL;
   ALLEGRO_EVENT ev;
   bool redraw = true;
   if(!al_init()) {
      fprintf(stderr, "failed to initialize allegro!\n");
      return -1;
   }
   timer = al_create_timer(1.0 / FPS);
   if(!timer) {
      fprintf(stderr, "failed to create timer!\n");
      return -1;
   }
   display = al_create_display(640, 480);
   if(!display) {
      fprintf(stderr, "failed to create display!\n");
      al_destroy_timer(timer);
      return -1;
   }
 
   event_queue = al_create_event_queue();
   if(!event_queue) {
      fprintf(stderr, "failed to create event_queue!\n");
      al_destroy_display(display);
      al_destroy_timer(timer);
      return -1;
   }
 
   al_register_event_source(event_queue, al_get_display_event_source(display));
   al_register_event_source(event_queue, al_get_timer_event_source(timer));
   al_clear_to_color(al_map_rgb(0,0,0));
   al_flip_display();
   al_start_timer(timer);
 
   while(1)
   {
      al_wait_for_event(event_queue, &ev);
      if(ev.type == ALLEGRO_EVENT_TIMER) {
         redraw = true;
      }
      else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
         break;
      }
      if(redraw && al_is_event_queue_empty(event_queue)) {
         redraw = false;
         al_clear_to_color(al_map_rgb(0,0,0));
         al_flip_display();
      }
   }
   al_destroy_timer(timer);
   al_destroy_display(display);
   al_destroy_event_queue(event_queue);
 
   return 0;
}
==== Détails ====
Cette fois-ci nous avons quelques nouveautés et quelques modifications.
const float FPS = 60;
C'est le ratio pour limiter la fréquence d'update.
   timer = al_create_timer(1.0 / FPS);
On initialise notre timer à **1.0 / FPS** seconde par tick.
   al_register_event_source(event_queue, al_get_timer_event_source(timer));
On dirige la source d'events du timer vers notre queue de manière à les récupérer plus tard.
   al_start_timer(timer);
évident? cette instruction démarre notre timer sans laquelle nous aurions aucun events.
      al_wait_for_event(event_queue, &ev);
Nous modifions un peu. Maintenant que nous avons régulièrement des events, nous n'avons plus besoin de nous inquiéter d'être bloqué par cette fonction. **al_wait_for_event** attendra un event pour toujours.
      if(event.type == ALLEGRO_EVENT_TIMER) {
         redraw = true;
      }
Ici nous vérifions que nous avons bien affaire à un event de type Timer, si c'est le cas, nous demandons de redessiner. Si nous devons mettre à jour la logique du jeu, nous devons aussi le faire ici.
      if(redraw && al_is_event_queue_empty(event_queue)) {
         redraw = false;
         al_clear_to_color(al_map_rgb(0,0,0));
         al_flip_display();
      }
Pourquoi mettre un AND logique ici? Nous devons être sûr que notre queue d'events est vide avant de redessiner à l'écran. Bien sur, ça n'a aucun intérêt maintenant, mais ça en aura pas la suite.
Donc on vérifie si **redraw** est **true**, et si la queue est vide, si les deux sont true, alors peint le display, on échange les buffers, on met redraw à **false**, et le boucle recommence.
Comme dans l'exemple précédent, celui-ci se termine quand vous cliquez sur le bouton //quitter// de la fenêtre.
   al_destroy_timer(timer);
Désinstalle notre Timer .
Ce qui conclut notre article sur les Timers d'Allegro 5.
[[allegro:events|Précédent]] << [[allegro:start#articles|Sommaire]] >> [[allegro:bitmaps|Suivant]]