Première fenêtre

Publié le par Tito le mazout

J'attaque maintenant la première partie du tutorial  : Ouvrir une fenêtre avec SDL : http://fearyourself.developpez.com/tutoriel/sdl/morpion/part1/ .
Tout est clairement expliqué ... Il suffit de recopier le source, sans oublier de terminer la procédure main par un return et une accolade fermante :

#include <SDL.h>
#include <iostream>
const int WIDTH=640;
const int HEIGHT=480;
int main(int argc, char **argv)
{
   //Déclaration des variables
    SDL_Event event;
    SDL_Surface *screen;
    int done = 0;
    //Initialisation de SDL
    if(SDL_Init(SDL_INIT_VIDEO)!=0) {
        std::cerr << "Problème pour initialiser SDL\n" << SDL_GetError() << std::endl;
        return 1;
    }
    //Mettre un titre à la fenêtre
    SDL_WM_SetCaption("Programme SDL de base", NULL);
    //Ouvrerture d'une surface pour l'affichage de la fenêtre
    screen = SDL_SetVideoMode(WIDTH,HEIGHT, 32,
         SDL_DOUBLEBUF | SDL_HWSURFACE);
    if(screen==NULL)
         done = 1;
    //Boucle générale
    while(!done)
    {
    //Traiter les évènements
    while(SDL_PollEvent(&event))
    {
         switch(event.type)
         {
           //Si on veut quitter, done=1 suffira
            case SDL_QUIT:
               done=1;
               break;
           //Si on vient de relâcher une touche de clavier
            case SDL_KEYUP:
               //Et si c'est la lettre q
               if(event.key.keysym.sym==SDLK_q)
               //On met done a 1 pour quitter
                    done=1;
                    break;
           //Sinon on ne fait rien
            default:
                break;
         }
    }
   }
  SDL_Quit();
  return 1
}

On compile, on lance, et on obtient une fenêtre noire de 640 x 480, non redimensionnable. Elle se ferme bien toute seule quand on clique sur la croix, ... mais pas quand on utilise la touche Q. En effet, SDL travaille avec un clavier QWERTY : sans surprise, le A permet effectivement de fermer la fenêtre.

On remarquera le passage de paramètres à la fonction "SDL_SetVideoMode" :
SDL_SetVideoMode(GI_WIDTH,GI_HEIGHT,32,SDL_DOUBLEBUF | SDL_HWSURFACE)
SDL_DOUBLEBUF | SDL_HWSURFACE revient à dire à dire SDL_DOUBLEBUF + SDL_HWSURFACE.
Dans le principe, on a une valeur d'affectée à SDL_DOUBLEBUF et à SDL_HWSURFACE, par exemple 1 et 2, on obtient ainsi  :
SDL_DOUBLEBUF = 1                             soit 0001 en binaire
SDL_HWSURFACE = 2                            soit 0010 en binaire
SDL_DOUBLEBUF + SDL_HWSURFACE = 3 soit 0011 en binaire
L'avantage du système est double :
- d'une part, les fonctionnalités sélectionnées sont lisibles (SDL_DOUBLEBUF | SDL_HWSURFACE est plus facile à interpréter que 3 ou 11)
- d'autre part, cela évite d'avoir des fonctions avec un trop grand nombre de paramètres : sans ce système, SDL_SetVideoMode devrait recevoir 14 paramètres.

Mais, n'étant jamais totalement satisfait, je me propose un nouvel exercice : remettre ce source en forme via ma convention de programmation personnelle (cf :
Convention de programmation )
:

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

const int GI_WIDTH =640;
const int GI_HEIGHT=480;

int main(int i_Argc, char** ppc_Argv)
{
    SDL_Event     ls_Event;
    SDL_Surface* lps_Screen;
    int                li_Done = 0;

    if(SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        std::cerr << "Problème pour initialiser SDL\n" << SDL_GetError() << std::endl;
        return 1;
    }

    SDL_WM_SetCaption("Programme SDL de base", NULL);

    lps_Screen = SDL_SetVideoMode(GI_WIDTH,GI_HEIGHT,32,SDL_DOUBLEBUF | SDL_HWSURFACE);
    if(lps_Screen==NULL) li_Done = 1;

    while(!li_Done)
    {
         while(SDL_PollEvent(&ls_Event))
         {
             switch(ls_Event.type)
             {
                 case SDL_QUIT:
                     li_Done = 1;
                     break;
                 case SDL_KEYUP:
                     if(ls_Event.key.keysym.sym == SDLK_q) li_Done = 1;
                     break;
                 default:
                     break;
             }
         }
    }

    SDL_Quit();

    return 1;
}

La principale différence avec le source d'origine vient de la dénommination des variables.
J'ai aussi supprimé les commentaires "superflus", aéré et réindenté une partie du code.


Enfin j'ai modifié la clause "case SDL_KEYUP:" pour ajouter le break.
Cette commande sert à sortir du "switch" sans exécuter la suite du source : il faut savoir qu'en C++,dans un "switch", les commandes sont exécutées de l'entrée par un "case", jusqu'à ce que l'on rencontre un "break" ou que l'on arrive à la fin du "switch" : en l'occurence, dans le source d'origine, dans le cas où la condition du "if" était remplie, le programme exécutait successivement l'affectation de "1" dans "Done" du cas "case SDL_KEYUP:", puis le "break" du cas "default:".
Je n'aime pas cette façon d'écrire car cela rend le source moins lisible.


Ce que l'on doit aussi en retenir, c'est qu'il est important de faire les bons choix au moment de l'écriture du source. En effet, ici, le remettre en forme n'est pas bien compliqué, avec seulement une procédure de quelques lignes et sept variables. J'ai tout de même réussi à avoir deux erreurs de compilations. Dans un source plus conséquent, nul doute qu'une telle opération de mise en conformité deviendrait difficilement gérable.

Publicité

Publié dans Premiers pas avec SDL

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article