FAQ SDL
FAQ SDLConsultez toutes les FAQ
Nombre d'auteurs : 6, nombre de questions : 67, création le 10 mai 2013
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 :
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 :
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.
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.
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 :
SDL_Event ev;
ev.type =
SDL_USEREVENT;
SDL_PushEvent
(&
ev);
En voulant récupérer les évènements avec la SDL, nous pouvons utiliser deux fonctions :
int
SDL_PollEvent
(
SDL_Event *
event);
ou
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 :
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 :
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 :
/* Attente d'un évènement */
if
(
SDL_WaitEvent
(&
event)) {
/* Correct */
switch
(
event.type)
{
case
SDL_QUIT :
jeu_continue =
0
;
break
;
....
default
:
break
;
}
}