FAQ SDLConsultez toutes les FAQ

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

 
OuvrirSommaireÉvènementsClavier

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 :

 
Sélectionnez
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 :

 
Sélectionnez
/* 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);
Créé le 16 mars 2006  par Fiquet

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.

Créé le 16 mars 2006  par Fiquet

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 :

 
Sélectionnez
/* 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.

Créé le 16 mars 2006  par Fiquet

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 http://jeux.developpez.com/faq/sdl/?page=clavier#EVENTS_repetition_touches).

 
Sélectionnez
/* 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.

 
Sélectionnez
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;
}
Créé le 16 mars 2006  par Laurent Gomila
  

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.