FAQ SDL
FAQ SDLConsultez toutes les FAQ
Nombre d'auteurs : 6, nombre de questions : 67, création le 10 mai 2013
Lors de l'appui sur une touche, il est possible d'obtenir le code de caractère unicode correspondant. Il suffit pour cela d'activer l'unicode en appelant la fonction :
int
SDL_EnableUNICODE
(
int
enable)
Avec le paramètre enable à 1, et ensuite de récupérer le code de caractère dans le membre unicode de SDL_keysym. Par exemple comme ceci :
/* On active l'unicode */
SDL_EnableUNICODE
(
1
);
/* Dans notre code qui questionne la file d'évènements lors d'un évènement SDL_KEYDOWN ou SDL_KEYUP... */
if
(
Event.key.keysym.sym ==
SDLK_a)
printf
(
"
Code UNICODE de 'a' : %i
"
, Event.key.keysym.unicode);
Grâce à la fonction SDL_EnableKeyRepeat(int delay, int interval), qui prend en paramètre le temps avant que l'on commence la répétition et le temps entre chaque répétition. SDL générera alors automatiquement un nouvel évènement dans le délai souhaité si la touche reste enfoncée.
On peut aussi utiliser les valeurs par défaut pour ces deux paramètres qui sont SDL_DEFAULT_REPEAT_DELAY et SDL_DEFAULT_REPEAT_INTERVAL. Pour désactiver la répétition, on peut appeler la fonction avec le paramètre delay à 0.
Une fois que l'on a questionné la file d'évènements, on peut tester quelle touche a été pressée grâce à la structure SDL_Event que l'on a passée en paramètre à SDL_PollEvent().
Par exemple, si l'on veut tester si la touche « HAUT » ou la touche « A » a été appuyée, on peut faire comme ceci :
/* Dans notre code qui questionne la file d'évènements lors d'un évènement SDL_KEYDOWN ou SDL_KEYUP... */
if
(
Event.key.keysym.sym ==
SDLK_UP)
{
/* Code à exécuter si l'on a appuyé sur la touche 'HAUT' */
}
if
(
Event.key.keysym.sym ==
SDLK_a)
{
/* code à exécuter si l'on a appuyé sur la touche 'A' */
}
/* ... */
Ici il faut juste savoir que le membre sym est une structure de type SDLKey qui contient les noms des touches définis par SDL. Pour obtenir une liste de ces noms, voir la doc officielle ou bien l'en-tête « SDL_keysym.h ». Ces noms sont toujours de toute façon significatifs.
Les évènements SDL imposent une gestion non continue des touches, à savoir que si vous voulez faire avancer un personnage en testant SDL_KEYDOWN (par exemple), le mouvement sera saccadé.
Il existe deux solutions pour pallier ce problème.
La première est de récupérer l'état des touches par un autre moyen : la fonction SDL_GetKeyState. Ainsi on pourra détecter l'appui sur une touche à chaque frame, et non via un timing imposé (voir https://jeux.developpez.com/faq/sdl/?page=clavier#EVENTS_repetition_touches).
/* Dans la boucle de jeu principale... */
Uint8*
keys =
SDL_GetKeyState
(
NULL
);
if
(
keys[SDLK_UP])
{
/* Faire avancer personnage par exemple */
Personnage.Position +=
5
;
}
if
(
keys[SDLK_DOWN])
{
/* Faire reculer personnage */
Personnage.Position -=
5
;
}
La seconde solution est de gérer l'état « enfoncé » des touches soi-même. En pratique on stocke l'état d'une touche dans une variable de type booléen (ou équivalent), que l'on place à false (ou 0) lors de la réception de SDL_KEYUP, et true (ou 1) à la réception de SDL_KEYDOWN. Ainsi on pourra également consulter l'état des touches à chaque frame.
bool Pressed =
false
;
while
(
SDL_PollEvent
(&
Event))
{
switch
(
Event.type)
{
case
SDL_KEYDOWN :
if
(
Event.key.keysym.sym ==
SDLK_UP)
Pressed =
true
;
break
;
case
SDL_KEYUP :
if
(
Event.key.keysym.sym ==
SDLK_UP)
Pressed =
false
;
break
;
}
}
/* ... */
if
(
Pressed)
{
/* Faire avancer personnage par exemple */
Personnage.Position +=
5
;
}