Formations à l'informatique et à l'électronique

Auteur : SD
Créé le : 06-03-2019

Bibliothèque graphique pour la SDL

Logo SDL Simple DirectMedia Layer

Pour pouvoir utiliser cette bibliothèque il faut au préalable avoir créé un nouveau projet utilisant la SDL dans NetBeans : voir la méthode ici.

La bibliothèque est composée de deux fichiers :

Installation

Copier les fichiers "graphique.c" et "graphique.h" dans le dossier de votre projet (celui où il y a "main.c").

Configuation du projet

Faire un clic droit sur "Header Files" et cliquer sur "Add Existing Item...".

Sélectionner le fichier "graphique.h" et cliquer sur "Select".

Faire un clic droit sur "Source Files" et cliquer sur "Add Existing Item...".

Sélectionner le fichier "graphique.c" et cliquer sur "Select".

Premier test - Formes géométriques

Ce premier code affiche une fenêtre de 800x600 pixels à l'écran, dessine quelques formes et ferme la fenêtre au bout de 6 secondes.

#include <stdio.h>
#include <stdlib.h>

#include "graphique.h"

int main(int argc, char** argv) {

// Création d'une fenêtre de 800 x 600
initWindow("Fenêtre by SD", 800, 600);

// Efface le fenêtre, fond blanc
backgroundWhite();

// Dessine un rectangle couleur par défaut : noire
rect(100, 50, 300, 80);

// La couleur par défaut est maintenant rouge (255,0,0)
fill(255,0,0);
// Dessine un rectangle rouge
rect(100, 400, 300, 150);
// Dessine une ligne horizontale rouge
ligneHorizontale(50, 300, 200);

// La couleur par défaut est maintenant verte (0,255,0)
fill(0,255,0);
// Dessine une ligne verticale verte
ligneVerticale(150,150,200);
// Dessine un cercle vert
cercle(600,150,120);
// Place un point vert au centre du cercle
setPixel(600,150);

// La couleur par défaut est maintenant bleue (0,0,255)
fill(0,0,255);
// Dessine une ligne bleue
ligne(50,300,150,150);
// Dessine un disque bleu
disque(600,400,90);

// Sans cet appel à refreshWindow, les formes précédentes sont en mémoire
// mais non visible à l'écran. Cet appel est donc indispensable. On le fait
// une seule fois pour toutes les formes car il est couteux en temps
refreshWindow();

// On attend 6 secondes
delay_ms(6000);

// On ferme la fenêtre
exitWindow();

// On quitte le programme avec succès
return 0;
}

Résultat attendu

Deuxième test - gestion des événements

Ce deuxième code est identique au précédent sauf que, au lieu d'attendre 6 secondes pour fermer la fenêtre, celle-ci est affichée jusqu'à ce que l'utilisateur clique sur le bouton de fermeture en haut à droite de la fenêtre.

#include <stdio.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_surface.h>

#include "graphique.h"

int main(int argc, char** argv) {

SDL_Event event; // La variable pour récupérer le type d'événement
int continuer = 1; // Pour la boucle "run"

// Création d'une fenêtre de 800 x 600
initWindow("Fenêtre by SD", 800, 600);

// Efface le fenêtre, fond blanc
backgroundWhite();

// Dessine un rectangle couleur par défaut : noire
rect(100, 50, 300, 80);

// La couleur par défaut est maintenant rouge (255,0,0)
fill(255,0,0);
// Dessine un rectangle rouge
rect(100, 400, 300, 150);
// Dessine une ligne horizontale rouge
ligneHorizontale(50, 300, 200);

// La couleur par défaut est maintenant verte (0,255,0)
fill(0,255,0);
// Dessine une ligne verticale verte
ligneVerticale(150,150,200);
// Dessine un cercle vert
cercle(600,150,120);
// Place un point vert au centre du cercle
setPixel(600,150);

// La couleur par défaut est maintenant bleue (0,0,255)
fill(0,0,255);
// Dessine une ligne bleue
ligne(50,300,150,150);
// Dessine un disque bleu
disque(600,400,90);

// Sans cet appel à refreshWindow, les formes précédentes sont en mémoire
// mais non visible à l'écran. Cet appel est donc indispensable. On le fait
// une seule fois pour toutes les formes car il est couteux en temps
refreshWindow();

// Boucle principale exécutée tant que continuer vaut 1
while (continuer) {
SDL_WaitEvent(&event); // On attend un événement qu'on récupère dans event
switch (event.type) { // On teste le type d'événement
case SDL_QUIT: // Si c'est un événement QUITTER
continuer = 0; // On met le booléen à 0, donc la boucle principale va s'arrêter
break;
}
}

// On ferme la fenêtre
exitWindow();

// On quitte le programme avec succès
return 0;
}

Troisième test - événements clavier

Ce troisième code est identique au précédent sauf que, l'utilisateur peut également appuyer sur la touche "echap" du clavier pour fermer la fenêtre.

#include <stdio.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_surface.h>

#include "graphique.h"

int main(int argc, char** argv) {

SDL_Event event; // La variable pour récupérer le type d'événement
int continuer = 1; // Pour la boucle "run"

// Création d'une fenêtre de 800 x 600
initWindow("Fenêtre by SD", 800, 600);

// Efface le fenêtre, fond blanc
backgroundWhite();

// Dessine un rectangle couleur par défaut : noire
rect(100, 50, 300, 80);

// La couleur par défaut est maintenant rouge (255,0,0)
fill(255,0,0);
// Dessine un rectangle rouge
rect(100, 400, 300, 150);
// Dessine une ligne horizontale rouge
ligneHorizontale(50, 300, 200);

// La couleur par défaut est maintenant verte (0,255,0)
fill(0,255,0);
// Dessine une ligne verticale verte
ligneVerticale(150,150,200);
// Dessine un cercle vert
cercle(600,150,120);
// Place un point vert au centre du cercle
setPixel(600,150);

// La couleur par défaut est maintenant bleue (0,0,255)
fill(0,0,255);
// Dessine une ligne bleue
ligne(50,300,150,150);
// Dessine un disque bleu
disque(600,400,90);

// Sans cet appel à refreshWindow, les formes précédentes sont en mémoire
// mais non visible à l'écran. Cet appel est donc indispensable. On le fait
// une seule fois pour toutes les formes car il est couteux en temps
refreshWindow();

// Boucle principale exécutée tant que continuer vaut 1
while (continuer) {
SDL_WaitEvent(&event); // On attend un événement qu'on récupère dans event
switch (event.type) { // On teste le type d'événement
// événement QUITTER
case SDL_QUIT:
continuer = 0; // On met le booléen à 0, donc la boucle principale va s'arrêter
break;

// événement appuie sur une touche du clavier
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_ESCAPE: // touche Echap, on arrête le programme
continuer = 0;
break;
}

}
}

// On ferme la fenêtre
exitWindow();

// On quitte le programme avec succès
return 0;
}

Pour voir les codes correspondant aux autres touches du clavier : https://wiki.libsdl.org/SDL_Keycode

Quatrième test - événements timer

Ce quatrième code fait défiler une balle de gauche à droite de l'écran. Les fonctionnalités précédentes de fermeture de la fenêtre sont conservées.

#include <stdio.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_surface.h>

#include "graphique.h"

// Définition des constantes de la fenêtre
const char* WINDOW_TITLE = "Fenêtre by SD";
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;

// Définition des constantes de la balle
const int RAYON = 10;
const int DEFAULT_SPEED = 15;

int main(int argc, char** argv) {

SDL_Event event; // La variable pour récupérer le type d'événement
int continuer = 1; // Pour la boucle "run"

int vitesse_x = DEFAULT_SPEED;
int posx = RAYON;
int posy = (WINDOW_HEIGHT / 2) - RAYON;

// Création de la fenêtre
initWindow(WINDOW_TITLE, WINDOW_WIDTH, WINDOW_HEIGHT);

// Boucle principale exécutée tant que continuer vaut 1
while (continuer) {
SDL_WaitEvent(&event); // On attend un événement qu'on récupère dans event
switch (event.type) { // On teste le type d'événement
// événement QUITTER
case SDL_QUIT:
continuer = 0; // On met le booléen à 0, donc la boucle principale va s'arrêter
break;

// événement appuie sur une touche du clavier
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_ESCAPE: // touche Echap, on arrête le programme
continuer = 0;
break;
}
break;

// événement Timer (toutes les 25ms, initialisé dans "initWindow")
case SDL_USEREVENT:
// Change la position de la balle
posx = posx + vitesse_x;
if (posx > WINDOW_WIDTH - RAYON) posx = RAYON;

// Redessine l'écran
backgroundWhite();
fill(0, 0, 255);
disque(posx, posy, RAYON);
refreshWindow();

break;
}
}

// On ferme la fenêtre
exitWindow();

// On quitte le programme avec succès
return 0;
}


Vous avez apprécié cet article ? Partagez le !

Article connexe : Configuration d'un projet NetBeans pour utiliser la SDL