3.6 Vite un exemple

Nous allons écrire un fichier main.cpp, pour afficher une fenêtre avec une image de fond.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

using namespace std;

//ça évite de courir après la ligne où on initialise l'image
const char* IMAGE = "../dragon-35.jpg";

void attente(){
	SDL_Event event;
	//on attend le clic dans la croix
	while(event.type != SDL_QUIT){
		SDL_WaitEvent(&event); //on récupère les événements
	}
}

int main(int argc, char** argv){
	SDL_Surface *ecran = NULL, *imageDeFond = NULL; //création des SDL_Surface*
	SDL_Rect positionFond;
	positionFond.x = 0;
	positionFond.y = 0;
	SDL_Init(SDL_INIT_VIDEO);
	ecran = SDL_SetVideoMode(800, 582, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
	SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
	
	/* Chargement d'une image dans une surface */
	imageDeFond = IMG_Load(IMAGE);
	if(imageDeFond != NULL){ /* On blitte par-dessus l'écran */
		SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
	}else{ //Oh le foirage
		cerr << "Impossible d'initialiser l'image " << IMAGE << endl;
	}
	
	SDL_Flip(ecran);
	
	attente(); //on attend
	if(imageDeFond != NULL){
		SDL_FreeSurface(imageDeFond); /* On libère la surface si elle n'est pas NULL */
	}
	SDL_Quit(); //on quitte SDL
	return EXIT_SUCCESS;
}

Il ne faut pas oublier de changer le fichier CMakeLists.txt :

1
2
3
4
5
6
7
8
9
10
project(fenetreSDL)
cmake_minimum_required(VERSION 2.6)
#on demande a CMake de trouver le paquet SDL
find_package(SDL REQUIRED)
#il faut inclure de dossier ${SDL_INCLUDE_DIR} ou il y a les .h de SDL
include_directories(${SDL_INCLUDE_DIR})
#on créé l’exécutable
add_executable(fenetreSDL main.cpp)
#on lie SDL au programme
target_link_libraries(fenetreSDL SDL SDL_image)

On compile :

make
Scanning dependencies of target fenetreSDL
[100%] Building CXX object CMakeFiles/fenetreSDL.dir/main.cpp.o
Linking CXX executable fenetreSDL
[100%] Built target fenetreSDL

On exécute le programme :

./fenetreSDL

Et voilà ce que l'on obtient :

plop

Pourquoi on met attente et pas pause comme tout à l'heure ?

Compilez avec pause pour voir.

Au secours, ça marche pas.

Dans ce cas pas de panique, que dit le compilateur ?

Le compilateur me dit :

main.cpp: In function ‘void pause()’:
main.cpp:10: error: new declaration ‘void pause()’
/usr/include/unistd.h:465: error: ambiguates old declaration ‘int pause()’

Restons calme.

La première ligne vous indique la le fichier et la fonction où il y a un problème.

La seconde vous indique la ligne dans le fichier et le type de problème (en anglais). New declaration 'void pause' veut dire que vous avez redéfinit une fonction en faisant une nouvelle déclaration : void pause().

La troisième ligne vous indique la situation de la fonction redéfinie : dans le fichier /usr/include/unistd.h ligne 465 la fonction s'appelle int pause().

Pour enlever l'erreur on ne va pas s'amuser à changer le nom de la fonction int pause() mais bien la notre. En la nommant void attente() on supprime le problème (qui vient en fait d'une fonction int pause() utilisée par SDL_image). En effet, vous avez le droit de surcharger une fonction que si vous passez des paramètres différents, deux fonctions ayant les mêmes paramètres mais ne retournant pas le même type de valeur ne sont pas correctes.

Voilà l'incident est clôt. Dans ces cas la appelez vous que le compilateur est là pour vous aider (même si ça peut être trèèèèèèèèès énervant).