Bonjour,
voilà, j'apprends à utiliser SDL et j'ai fait un petit programme pour afficher des images en utilisant le principe : clic_sélection/clic_déposer l'image. Je suis sous Linux Debian Lenny et je code dans Codeblocks.
Une image pour mieux comprendre :
Sous codeblocks mon programme fonctionne avec un bug important : je n'arrive pas toujours à effacer mes images en cliquant sur le bouton effacer. Le plus souvent ça fonctionne mais qq fois ça ne marche pas.
En revanche je n'arrive pas à faire foncionner mon programme en dehors de codeblocks avec l'exécutable.
Avec gdb ça marche, je n'ai pas d'erreur.
Donc en résumé voici mes deux questions :(gdb) run
Starting program: /home/acryline/programmation/SDL/test3/bin/Debug/test2
[Thread debugging using libthread_db enabled]
[New Thread 0xb7516940 (LWP 6131)]
Program exited normally
- pourquoi le bouton effacer ne fonctionne t-il pas toujours ?
- que dois-je faire pour faire fonctionner mon programme en dehors de codeblocks et de gdb ?
- si vous trouvez d'autres bug (j'ai mal défini la zone de dessin , elle ne va pas assez haut etc..)
Merci pour vos réponses.
Voici le code zippé de mon programme + les images nécessaires pour le faire fonctionner :http://www.cogite.info/fichiers/test.zip
Et pour ceux qui ne veulent pas le télécharger voici le code en trois fichiers : :p
header.h
main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #ifndef DEF_SDL #define DEF_SDL void evenement (SDL_Surface*, SDL_Surface *,SDL_Surface *, SDL_Rect*); #endif
fonctions.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include "header.h" int main(int argc, char *argv[]) { SDL_Surface *ecran = NULL, *zozor =NULL, *fond=NULL; SDL_Rect pos_fond, pos_zozor; if(SDL_Init(SDL_INIT_VIDEO)==-1) { printf("Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); exit(EXIT_FAILURE); // On quitte le programme } ecran= SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if(ecran==NULL) { printf( "Impossible de charger le mode vidéo : %s\nq", SDL_GetError()); exit(EXIT_FAILURE); } SDL_WM_SetCaption(" Dessin ", NULL); SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255, 255,255)); //chargement des images et affichage zozor= IMG_Load("zozor.bmp"); fond= IMG_Load("fond.bmp"); SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255)); SDL_BlitSurface(fond,NULL,ecran,&pos_fond); SDL_BlitSurface(zozor,NULL,ecran,&pos_zozor); SDL_Flip(ecran); //boucle evenement(ecran,zozor,fond,&pos_zozor); SDL_FreeSurface(fond); SDL_FreeSurface(zozor); SDL_Quit(); return EXIT_SUCCESS; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include "header.h" void evenement (SDL_Surface* ecran, SDL_Surface *zozor, SDL_Surface *fond,SDL_Rect *pos_zozor) { int continuer =1; SDL_Rect pos_fond; SDL_Event event; pos_zozor->x=-1; pos_zozor->y=-1; while(continuer) { SDL_PollEvent(&event); switch (event.type) { case SDL_QUIT: continuer=0; break; //mouvement de la souris case SDL_MOUSEMOTION: switch(event.button.button) { //si le bouton gauche est enfoncé zozor prend les coordonnées de la souris case SDL_BUTTON_LEFT: pos_zozor->x=event.button.x-(zozor->w/2); pos_zozor->y=event.button.y-(zozor->h/2); break; default: //printf("%d\n",event.button.y); break; } //si on clique case SDL_MOUSEBUTTONDOWN: switch(event.button.button) { //clic grauche case SDL_BUTTON_LEFT: //si la souris est au delà de la coordonnée x= 100 if(event.button.x<100) { //sélection de zozor if(event.button.y<100) { SDL_FreeSurface(zozor); zozor= IMG_Load("zozor.bmp"); SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255)); } //sélection de la girafe if(event.button.y>100 && event.button.y<220) { SDL_FreeSurface(zozor); zozor= IMG_Load("girgif.bmp"); SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255)); } //effacer la zone de dessin if(event.button.y>420 && event.button.y<492) { SDL_BlitSurface(fond,NULL,ecran,&pos_fond); } //quitter le programme if(event.button.y>496 && event.button.y<577) { continuer=0; } } pos_zozor->x=event.button.x-(zozor->w/2); pos_zozor->y=event.button.y-(zozor->h/2); break; default: break; } break; default: break; } if(pos_zozor->x >100 && pos_zozor->y >-1 && pos_zozor->x<ecran->w && pos_zozor->y < ecran->h) { SDL_BlitSurface(zozor,NULL,ecran,pos_zozor); } SDL_Flip(ecran); } }
Partager