Programmation avec la SDL/Initialisation de la SDL
Enfin, nous allons pouvoir commencer à coder avec la SDL.
Dans ce chapitre, nous verrons comment initialiser la SDL, opération nécessaire si l'on veut pouvoir l'utiliser.
Un premier code
modifierVoici la structure de base pour coder avec la SDL :
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
return 0;
}
Comme on peut le voir, ce code ne diffère presque pas du code de base du C. En fait, on y ajoute seulement l'inclusion de la SDL 2.0 :
#include <SDL2/SDL.h>
Initialisation de la SDL
modifierAfin de pouvoir coder avec la SDL, nous devons initialiser celle-ci. Pour cela, nous allons utiliser la fonction SDL_Init. En voici son prototype :
int SDL_Init(Uint32 flags);
La fonction SDL_Init renvoie 0 si l'initialisation a réussi et -1 en cas d'erreur.
La SDL se divise en plusieurs sous-systèmes. Pour initialiser un ou plusieurs sous-systèmes, on utilisera la syntaxe suivante :
SDL_Init(SOUS_SYSTEME);//Pour un seul sous-système
SDL_Init(SOUS_SYSTEME_1 | SOUS_SYSTEME2 | SOUS_SYSTEME_3 | ... );//Pour plusieurs sous-systèmes
Voici les différents flags que l'on peut passer en paramètre de la fonction SDL_Init :
Description | |
---|---|
SDL_INIT_TIMER | Le sous-système Timer, pour la gestion du temps. |
SDL_INIT_AUDIO | Le sous-système Audio. |
SDL_INIT_VIDEO | Le sous-système Vidéo, pour l'affichage graphique. |
SDL_INIT_HAPTIC | Le sous-système Haptic. |
SDL_INIT_JOYSTICK | Le sous-système Joystick. |
SDL_INIT_EVERYTHING | Initialise tous les sous-systèmes. |
SDL_INIT_NOPARACHUTE | Empêche la SDL de gérer les signaux fatals. |
Pour l'instant, nous n'utiliserons que le sous-système Vidéo. Le code sera donc :
SDL_Init(SDL_INIT_VIDEO);
Cette fonction ne peut être utilisée qu'une fois. Si vous voulez initialiser un ou plusieurs sous-systèmes après avoir utilisé SDL_Init, utilisez SDL_InitSubSystem.
On remarquera que le code ci-dessus est équivalent à celui-ci :
SDL_VideoInit(NULL);
Initialiser un ou plusieurs sous-systèmes après la première initialisation
modifierIl se peut que vous ayez besoin d'initialiser un sous-système après avoir initialisé au tout début la SDL. Pour cela, vous pouvez utiliser la fonction SDL_InitSubSystem. Celle-ci a exactement la même syntaxe que SDL_Init. Voici son prototype:
int SDL_InitSubSystem(Uint32 flags);
Gestion des erreurs
modifierNous avons vu que la fonction SDL_Init renvoyait -1 en cas d'erreur. Cependant, ce simple -1 ne nous renseigne pas sur la nature même de l'erreur. C'est pourquoi dans la SDL il existe une fonction plus poussée pour récupérer les erreurs : SDL_GetError. Elle renvoie la dernière erreur qui s'est produite au sein de la SDL. Voici son prototype :
char* SDL_GetError(void);
La manière la plus simple de l'utiliser dans le cas d'une erreur de SDL_Init est la suivante :
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("Erreur d'initialisation de la SDL : %s",SDL_GetError());//on affiche l'erreur
return EXIT_FAILURE;//on sort du programme pour éviter de plus gros problèmes
}
Quitter la SDL
modifierIl ne nous reste plus qu'à savoir comment quitter la SDL. Pour cela, rien de plus simple : utilisons SDL_Quit. Voici le code pour quitter la SDL :
SDL_Quit();
Si vous avez utilisé SDL_VideoInit, utilisez plutôt
SDL_VideoQuit();
Quitter un ou plusieurs sous-systèmes
modifierIl existe un équivalent de SDL_Quit pour quitter le ou les sous-systèmes que l'on désire. Cet équivalent est SDL_QuitSubSystem et a la même syntaxe que SDL_Init. Voici son prototype :
int SDL_QuitSubSystem(Uint32 flags);
Un second code amélioré
modifierAvec ce que nous venons d'apprendre, nous allons pouvoir écrire un second code, qui va servir de base à tous les programmes que vous coderez dans la première et la seconde partie :
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)//initialisation de la SDL
{
printf("Erreur d'initialisation de la SDL : %s",SDL_GetError());//on affiche l'erreur
return EXIT_FAILURE;//on sort du programme pour éviter de plus gros problèmes
}
SDL_Quit();//on quitte la SDL
return 0;
}