IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ SDL

FAQ SDLConsultez toutes les FAQ

Nombre d'auteurs : 6, nombre de questions : 67, création le 10 mai 2013 

 
OuvrirSommaireÉvènements

SDL gère les évènements grâce à une file d'évènements. Chaque nouvel évènement sera ajouté à la file l'un après l'autre.

L'une des manières de gérer les évènements est de questionner cette file grâce à la fonction SDL_PollEvent(), et de les stocker dans la structure SDL_Event :

 
Sélectionnez
SDL_Event Event;

/* Tant qu'on a encore des évènements dans la file */
while(SDL_PollEvent(&Event))
{
    switch (Event.type)
    {
        case SDL_KEYDOWN:
            /* code à exécuter en cas de pression sur une touche du clavier */

        case SDL_KEYUP:
            /* code à exécuter en cas de relâchement d'une touche du clavier */

        case SDL_MOUSEMOTION:
            /* code à exécuter en cas de mouvement de la souris */

        case SDL_MOUSEBUTTONDOWN:
            /* code à exécuter en cas de pression sur une touche de la souris */

        case SDL_MOUSEBUTTONUP:
            /* code à exécuter en cas de relâchement d'une touche de la souris */

        case SDL_QUIT:
            /* code à exécuter en cas de fermeture de la fenêtre */

        /* etc. */
    }
}

Une autre manière, plus rarement utilisée, est de faire une attente active sur les évènements avec la fonction :

 
Sélectionnez
int SDL_WaitEvent(SDL_Event* event)

Ce qui aura pour effet de bloquer le programme tant qu'aucun évènement n'est détecté. Les informations retournées dans le paramètre event peuvent être utilisées de la même manière qu'avec la méthode précédente.

Enfin, il est aussi possible de capturer directement l'état des évènements (voir par ex. https://jeux.developpez.com/faq/sdl/?page=clavier#EVENTS_etat_touches, https://jeux.developpez.com/faq/sdl/?page=clavier#EVENTS_touche_pressee ou https://jeux.developpez.com/faq/sdl/?page=souris#EVENTS_bouton_souris). Cependant si l'on n'utilise que ce système, il ne faudra pas oublier d'appeler périodiquement SDL_PumpEvents pour mettre à jour l'état des évènements.

Créé le 16 mars 2006  par Fiquet

Avec la fonction SDL_PushEvent(SDL_Event* event), dans laquelle on passe en paramètre une structure d'évènement que l'on aura remplie au préalable comme on le souhaite.

Créé le 16 mars 2006  par Fiquet

SDL permet au programmeur d'utiliser les évènements numérotés de SDL_USEREVENT jusqu'à SDL_MAXEVENTS - 1 pour les évènements liés à l'application.

Pour demander à ajouter un évènement (voir https://jeux.developpez.com/faq/sdl/?page=evenements#EVENTS_inserer) en spécifiant que c'est un évènement utilisateur :

 
Sélectionnez
SDL_Event ev;
ev.type = SDL_USEREVENT;
SDL_PushEvent(&ev);
Créé le 16 mars 2006  par fearyourself

En voulant récupérer les évènements avec la SDL, nous pouvons utiliser deux fonctions :

Prototype de SDL_PollEvent
Sélectionnez
         int SDL_PollEvent(SDL_Event *event);

ou

Prototype de SDL_PollEvent
Sélectionnez
int SDL_WaitEvent(SDL_Event *event);

La première est non bloquante, elle n'attend pas un évènement avant de sortir de la fonction. Elle retourne donc 1 si un évènement était en attente de traitement et 0 sinon. La deuxième est bloquante donc elle ne retournera 1 qu'en cas de réussite, mais aussi, en cas d'erreur, elle retournera 0.

Il est donc conseillé (pour ne pas dire obligatoire) de vérifier le retour de ces fonctions, car dans le cas d'un retour 0, le paramètre event reste inchangé.

Ceci provoque donc une répétition dans la gestion d'un évènement.

Puisque SDL_PollEvent est souvent mis dans une boucle while :

Mauvaise utilisation de la boucle générale
Sélectionnez
while(jeu_continue) {
  /* Gestion des évènements */

  SDL_PollEvent(&event);  /* A NE PAS FAIRE */
  switch(event.type) 
  {
   case SDL_QUIT : 
     jeu_continue = 0;
     break;
    ....
   default :
     break;
  } 
}

S'il n'y a pas d'évènements en attente, la fonction ne modifie pas la structure passée par pointeur et nous allons traiter une deuxième (ou n-ième) fois le même évènement.

La technique correcte consiste à utiliser une boucle interne pour les évènements :

Bonne utilisation de la fonction SDL_PollEvent
Sélectionnez
while(jeu_continue) {
  /* Gestion des évènements */
 while(SDL_PollEvent(&event)) { /* Correct */
  switch(event.type) 
  {
   case SDL_QUIT : 
     jeu_continue = 0;
     break;
    ....
   default :
     break;
  } 
 }
}

Enfin, pour SDL_WaitEvent, un test sur le retour est aussi nécessaire :

Bonne utilisation de la fonction SDL_WaitEvent
Sélectionnez
  /* Attente d'un évènement */
 if(SDL_WaitEvent(&event)) { /* Correct */
  switch(event.type) 
  {
   case SDL_QUIT : 
     jeu_continue = 0;
     break;
    ....
   default :
     break;
  } 
 }
Créé le 3 mai 2007  par fearyourself

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006-2012 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.