SDL est une bibliothèque pour créer des applications multimédias en deux dimensions comme des jeux vidéo, des interfaces graphiques, etc. Elle est simple, flexible et portable. Cette bibliothèque fonctionne sous de nombreux systèmes d'exploitation dont Linux, Windows, Windows CE, BeOS, Mac OS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, et QNX. Elle fonctionne aussi sous quelques systèmes embarqués. Elle est sous licence GNU LGPL version 2. Elle est Écrite en C. Elle peut être utilisée par de nombreux langages de programmation dont l'Ada, C/C++, C#, Ch, D, Eiffel, Erlang, Euphoria, Guile, Haskell, OCaml, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python (grâce à Pygame), Ruby et Smalltalk.
Sous Debian, installer les paquets libsdl1.2debian, libsdl1.2-dev, libsdl-image1.2, et d'autres paquets du genre libsdl-xxx1.2 si besoin d'autres extensions.
Les fichiers entêtes sont dans le répertoire suivant : /usr/include/SDL/
Le programme C commence par l'instruction include suivante : #include "SDL/SDL.h"
La commande de compilation précise la bibliothèque comme suivant : gcc main.c -lm -lSLD2
Pour pouvoir facilement afficher ou lire un point, on défini quelques fonctions de base comme indiqué dans le lien ci-dessus. On définie la fonction rand_n(n) qui retourne un entier entre 0 et n et qui corrige quelque défaut du générateur de nombre aléatoire. On définie la fonction getpixel(S, x, y) qui retourne la couleur du pixel (x,y), et la fonction putpixel(S,x,y,c) qui colore le pixel (x,y) en la couleur c.
///////////////////////////////////////////////// COUCHE 0 ////////////////////////////////////////////////////////////////////////// int rand_n(int n) { int pS = 1+(n==RAND_MAX ? 0 : (RAND_MAX-n) / (n+1)); int mUf = pS*n + (pS - 1); int d; do {d = rand();} while (d > mUf); return d/pS; } Uint32 getpixel(SDL_Surface *surface, int x, int y) { int bpp = surface->format->BytesPerPixel; /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch(bpp) { case 1: return *p;
case 2: return *(Uint16 *)p;
case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16;
case 4: return *(Uint32 *)p;
default: return 0; /* shouldn't happen, but avoids warnings */ } } void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) { int bpp = surface->format->BytesPerPixel; /* Here p is the address to the pixel we want to set */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch(bpp) { case 1: *p = pixel; break; case 2: *(Uint16 *)p = pixel; break; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (pixel >> 16) & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = pixel & 0xff; } else { p[0] = pixel & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = (pixel >> 16) & 0xff; } break;
case 4: *(Uint32 *)p = pixel; break; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main() { SDL_Init( SDL_INIT_VIDEO); SDL_Surface *S = NULL; S = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE||SDL_ANYFORMAT); SDL_WM_SetCaption("nom de la fenêtre", NULL); Uint32 c; int i,x,y;
SDL_MUSTLOCK(S);
for(i=0;i<10000;i++) { c = SDL_MapRGB(S->format, rand_n(255), rand_n(255), rand_n(255)); x = rand_n(640); y = rand_n(480); putpixel(S,x,y,c); } SDL_UnlockSurface(S);
SDL_UpdateRect(S, r1.x+150, r1.y+150, 1, 1); }
Sous Debian, installer les paquets libsdl2-2.0-0, libsdl2-dbg, libsdl2-dev, libsdl2-image-2.0-0, libsdl2-image-dbg, et d'autres paquets libsdl2-xxx si besoin d'autres extensions.
Les fichiers entêtes sont dans le répertoire suivant : /usr/include/SDL2/
Le programme C commence par l'instruction include suivante : #include "SDL2/SDL.h"
La commande de compilation précise la bibliothèque comme suivant : gcc main.c -lm -lSLD2
#include "SDL2/SDL.h"
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window * W1 = SDL_CreateWindow("fenêtre n°1",100,100,640,480,0);
SDL_Window * W2 = SDL_CreateWindow("fenêtre n°2",200,200,640,480,0);
SDL_Delay(5000);
SDL_DestroyWindow(W1);
SDL_DestroyWindow(W2);
}
Dans la SDL il y a 7 parties repris dans les 9 flags :
Pour charger uniquement la video, le timer et le joystick :
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK);
Identique à :
SDL_Init(0)
SDL_InitSubSystem(SDL_INIT_VIDEO);
SDL_InitSubSystem(SDL_INIT_TIMER | SDL_INIT_JOYSTICK);
La fonction SDL_Init renvoie une valeur -1 en cas d'erreur, et 0 si tout s'est bien passé. Pour afficher le contenu d' une erreur avec la SDL, on fait la méthode ci-dessous :
fprintf(stderr, "Erreur SDL_INIT : %s\n", SDL_GetError());
Cette méthode va créer un nouveau fichier et va l'appeler stderr.txt et les erreurs seront stockés dans SDL_GetError().
Les structures prédéfinies utiles :
structure SDL_Point {
int x;
int y;
}
structure SDL_Rect {
int x; // position x du coin haut-gauche du rectangle
int y; // position y de coin haut-gauche du rectangle
int w; // Largeur du rectangle
int h;
// Hauteur du rectangle
}
On définie une surface S non initialisée, puis on l'initialise avec un mode video en précisant sa taille en x, sa taille en y, le nombre de bits couleurs, et une liste de flags. Cette surface représente l'interieur de la fenêtre de l'application :
SDL_Surface *S ;
S = SDL_SetVideoMode(640, 480, 32, flags) ;
Comme pour SDL_Init, on utilise des flags pour définir des options. Voici les principaux flags que vous pouvez utiliser (et combiner avec le symbole "|") :
Pour fixer un titre à la fenêtre de l'application :
SDL_WM_SetCaption("Nom de la fenêtre ", NULL);
Uint bleuvert = SDL_MapRGB(ecran->format, 17, 206, 112)
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 17, 206, 112));
SDL_Flip(ecran);