Programmer en C++
SDL2 - Les événements

1. Fermeture d'une fenêtre SDL

Dans le chapitre précédent nous avons appris a créer une fenêtre, et à la maintenir ouverte quelques secondes.
Une bonne méthode consiste à analyser en boucle les événements qui se produisent dans la fenêtre. Lorsque l'événement de fermeture est detecté, on sort de la boucle et le programme se termine.
Découvrons maintenant ce code qui sera inséré juste après la création de la fenêtre, et avant la fonction "SDL_Quit()" :

int attendre = 1;
SDL_Event evenement;
while(attendre)
{
    SDL_WaitEvent(&evenement);
    switch(evenement.type)
    {
        case SDL_QUIT:
            attendre = 0;
    }
}

La fonction "SDL_Event" permet de créer une variable "evenement" qui nous permet de récupérer l'action de fermeture exercée sur la fenêtre (le clic sur la petite croix). Lorsque le message SDL_QUIT est identifié, nous modifions la variable "attendre" de façon à sortir de la boucle while(). Dans le cas contraire, si aucune action de fermeture n'est identifiée, le bouclage se poursuit.
Noter que la fonction SDL_WaitEvent() bloque le programme tant qu'un événement ne se présente pas. Nous verrons plus loin une fonction similaire mais ne bloquant pas le programme.

2. Evénements liés au clavier

De la même façon que nous avons récupéré l'événement fermeture de la fenêtre, nous pouvons aussi récupérer les événements concernant les actions sur le clavier (touche enfoncée, touche relachée, ...)
Par exemple l'identification de l'appui sur une touche se fait avec l'événement SDL_KEYDOWN. Ajoutons donc cette instruction dans la boucle d'événement :

switch(evenement.type)
{
    case SDL_QUIT:
        attendre = 0;

    case SDL_KEYDOWN:
        SDL_Log("Touche enfoncee");
}

Au passage, découvrons une nouvelle fonction SDL_Log() dont le rôle est d'afficher le texte qui lui est transmis en argument.

Cherchons maintenant précisément quelle touche a été enfoncée. Il faut savoir que la SDL a attribué un code pour chaque touche. Vous trouverez la liste complète de ces codes ici. Nous lisons par exemple que la touche 4 du pavé numérique possède le code "SDLK_KP_4".
Pour savoir si c'est bien cette touche qui a été enfoncée, on va donc comparer ce code à une information contenue dans la structure de l'événement. La syntaxe s'écrit ici :

if(evenement.key.keysym.sym == SDLK_KP_4)

Peut être arrivez vous maintenant à écrire un programme réagissant aux touches du clavier ? Si non voici l'exemple complet :

#include <iostream>
#include <SDL.h>

using namespace std;

int main(int argc, char* argv[])
{
    cout << "Une application SDL" << endl;

    SDL_Window *pFenetre;
    SDL_Init (SDL_INIT_VIDEO);
    pFenetre = SDL_CreateWindow(
            "Fenetre avec SDL", SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED, 600,
            400, SDL_WINDOW_SHOWN);

    int attendre = 1;
    SDL_Event evenement;

    // Boucle d'evenements
    while(attendre)
    {
        SDL_WaitEvent(&evenement);
        switch(evenement.type)
        {
            case SDL_QUIT:
                attendre = 0;
                break;

            case SDL_KEYDOWN:
                SDL_Log("Touche enfoncee");
                if(evenement.key.keysym.sym == SDLK_KP_4)
                    SDL_Log("C'est la touche 4");
        }
    }

    SDL_DestroyWindow(pFenetre);
    SDL_Quit ();

    return EXIT_SUCCESS;
}