SDL logo

C. Drocourt - 2006

drocourt@iut-amiens.fr

SDL

logo iut

Les évènements.

Pour se mettre en attente d'un évènement, il faut tout d'abord creer un objet du type SDL_Event, qui nous permettra de récupérer le type d'évenement survenu. On entre ensuite en général dans une boucle infinie :

while(SDL_PollEvent(&event)) {
  // Type d'évènement
  switch(event.type) {
    case SDL_KEYDOWN: // Si on presse une touche
      switch(event.key.keysym.sym) {
        case SDLK_ESCAPE: // Actions pour ECHAP
          break;
        case SDLK_LEFT: // Actions pour <-
          break;
        case SDLK_RETURN: // Actions pour ENTREE
          break;
        case SDLK_w: /* touche Z */ break;
        case SDLK_s: /* touche S */ break;
        case SDLK_a: /* touche Q */ break;
        case SDLK_d: /* touche D */ break;
        default:break;
      }
      break;
    case SDL_KEYUP: // Si on relache une touche
      break;
    case SDL_QUIT: // Fermeture du programme
      exit(0);
  }
}

Pour les évènements de la souris il faudra traiter SDL_MOUSEBUTTONDOWN et SDL_MOUSEBUTTONUP pour les boutons, dans ce cas le numéro du bouton pourra être récupéré dans la variable event.button.button, et SDL_MOUSEMOTION pour un déplacement, dans ce cas la position pourra être récupérée dans les variables event.motion.x, event.motion.y, event.motion.xrel et event.motion.yrel.

Une autre solution pour minimiser la consommation CPU est d'attendre un évènement, en effet nous interrongons en permanence la file d'évènements avec la fonction SDL_PollEvent(), alors que l'on pourrait se mettre simplement en attente avec la fonction SDL_WaitEvent().

Une autre méthode plus rapide pour le traitement du clavier consiste a récupérer l'etat global dans lequel se trouve le clavier, pour cela on utilise la fonction SDL_GetKeyState(), exemple :

Uint8 * keys;
while(
1) {
  while(SDL_PollEvent(&event)) {
    // Type d'évènement
    ...
  }
  // On récupère en une commande l'etat du clavier.
  keys = SDL_GetKeyState(NULL);
  if(keys[SDLK_UP]) //touche haut pressée;
  ...
}

Enfin, plutôt que de scruter en permanence les évènements qui peuvent arriver, ce qui fait obligatoirement augmenter l'utilisation CPU, le programme peut se mettre en attente d'évenement grâce à la fonction SDL_SetEventFilter(<nom de fonction>), la fonction passée en argument sera de la forme mafonction(const SDL_Event * event).

Exercice 1 : Modifiez votre programme pour controler le déplacement du motif tux sur le fond d'écran en utilisant les 2 méthodes.

Exercice 2 : Modifiez votre programme pour controler le déplacement du motif tux sur le fond d'écran avec la souris.

Remarque : N'hésitez pas à utiliser le manuel en ligne d'UNIX avec la fonction man, par exemple : man SDL_SetEventFilter.