Initialiser la librairie SDL





Ce premier cours va porter sur les bases théoriques liées à l'emploi de SDL.





Préalable





Les cours sur SDL ne seront pas restreint à une unique artchitecture, mais je ne décrirais ici que le fonctionnement sous Linux et éventuellemnt sous Win32. L'installation sous Linux se passe facilement via les fichiers de types 'rpm', ou les sources si vous préférez. Sous Windows les choses sont un peu plus délicates à mettre en oeuvre et je vous conseille de bien la lire la documentation. Sachez tout de même que la version Win32 que vous pouvez télécharger s'utilise avec Visual C++ 5 ou 6. Sous Linux la ligne type pour compiler un fichier source est l'une des deux méthodes suivantes :

    gcc -o monProg source.c -I/usr/include/SDL -lSDL -ldl -lpthread

    gcc -o monProg source.c `sdl-config --cflags --libs`

Attention ce ne sont pas des apostrophes mais des backquotes !!!

 

Reportez vous à l'annexe afin de connaître l'installation et l'utilisation de SDL sous Linux et Windows.





Notions de base





Enfin nous entrons dans le sujet ! SDL est donc une libraire multimédia simple à mettre en oeuvre et très efficace. Tout d'abord vous devez appeler au moins ce header : SDL.h

Sous linux il est généralement positionné dans /usr/include/SDL, donc vous devez l'inclure comme ceci :

    #include <SDL/SDL.h>

La fonction pour initialiser SDL est SDL_Init dont le prototype est SDL_Init(Uint32 flags). Une remarque peut dès à présent être faite, toutes les fonctions SDL ont cette caractéristique de commencer par SDL_, ce qui permet bien de différencier un appel à la librairie d'une autre fonction (ce qui utilisent allegro me comprendront ;-)). D'autre part le type Uint32 est un un type propre à SDL, il permet de déclarer un entier de 32 bits évidemment, mais cet entier fera effectivement 32 bits quelque soit la plateforme. On trouvera de la même manière Uint8, Uint16. Cet aspect est primordiale car SDL n'est pas dépendant d'une architecture et donc votre entier sera de la taille voulu sur une machine little endian ou sur une big endian.

SDL_Init prend en paramètre différents drapeaux (flags) qui permettent d'initialiser telle ou telle partie de la librairie. Voici ces paramètres :

  • SDL_INIT_TIMER
  • SDL_INIT_AUDIO
  • SDL_INIT_VIDEO
  • SDL_INIT_CDROM
  • SDL_INIT_JOYSTICK
  • SDL_INIT_NOPARACHUTE
  • SDL_EVENTTHREAD
  • SDL_EVERYTHING
  • SDL_OPENGL

Les drapeaux sont suffisament parlant et je ne les décrirai pas, si ce n'est l'obscur SDL_INIT_NOPARACHUTE. En fait lors de l'utilisation de SDL dans une application, si SDL doit sortir du programme avec un code d'erreur, un parachute de sécurité est déployé, afin de quitter du plus proprement possible l'application.

SDL_Init() prendra quasiment tout le temps le paramètre SDL_INIT_VIDEO, sans lequel toute manipulation de la vidéo par SDL serait vouée à l'échec. Il n'est pas indispensable d'initialiser tout ce dont vous avez besoin dès le début de votre application. Une fois l'initialisation du départ vous pouvez appeler la fonction SDL_InitSubSystem() afin d'initialiser un nouveau canal (son, joystick...) que vous refermez une fois que vous n'en n'avez plus besoin par un appel à SDL_QuitSubsystem(). La partie sonore ne sera donc exploitable qu'après un appel à son drapeau d'initialisation. Il existe enfin une fonction appelée SDL_WasInit() qui permet de connaître les différents systèmes qui ont été initialisés lors des appels des fonctions précédentes (fonction valavle depuis la version 1.1.5 je crois seulement).

Cette fonction s'appelle au tout début du programme de la manière suivante :

if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) <0){

fprintf(stderr,"Erreur d'initialisation vidéo de SDL %s\n",SDL_GeError());

exit(1);

}

Pour les habitués du C, ce type de routine ne vous posera pas trop de problème, pour les autres, on réalise un appel à SDL_Init(), si jamais celui-ci retourne un code d'erreur, on quitte le programme en indiquant le message d'erreur correspondant via un appel à la fonction SDL_GetError().

Bon maintenant que la librairie est initialisée on peut attaquer le morceau !

Et non... en fait pas encore une dernière précaution à prendre lors de l'initialisation de SDL est de gérer la fin de son utilisation. Pour cela il existe une fonction SDL_Quit(). Celle dernière s'occupe de fermer tout ce qui a été ouvert par SDL. D'une manière générale et pratique, on appel cette fonction via la fonction C ANSI atexit() qui prend en paramètre des fonctions, et qui lors de la fin de la boucle principale (le main()) appel les fonction passées en argument. C'est une manière très pratique de quitter proprement une application. Mais cette fonction est propre au C, donc en C++, vous devrez inclure le stdlib.h, ou entourer l'appel à atexit par un extern "C"{}.

Enfin on peut s'attaquer à l'utilisation à proprement parler de SDL... cette phase d'initialisation ici longuement abordée est en réalité très rapide à réaliser une fois qu'on acompris son fonctionnement.






[  Précédent  |  Index  |  Suivant  ]



by Sylvain Hellegouarch
Last update: 16/11/2000