Bonjour à tous et à toutes,
Je viens vous exposer un petit soucis survenu pendant la programmation d'un jeu 2D en SDL dans le cadre d'un projet scolaire.
C'est un DuckHunt, le principe du jeu est de tuer des canards.
Dans un premier temps, j'affiche un menu permettant de jouer ou de quitter puis le jeu se lance (si le joueur remplit la condition "play").
Mon codé est divisé en plusieurs fichiers .cc et .h.
Voici mon soucis : dans mon Main.cc,je fais appel à un PollEvent afin qu'il gère la fermeture de mon programme tout au long de celui-ci.
Cependant, je suis obligé de relancer une boucle "while PollEvent" pour fermer le programme pendant le jeu.
Ceci a pour conséquence une imbriquation de deux PollEvents et pour inconvénients d'obtenir un code non optimisé et un evenement assez surprenant : un SDL_Rect sensé bouger continuellement n'est en déplacement que lorsque je bouge ma souris.
Ma question est donc la suivante :
Comment faire pour n'avoir à déclarer qu'une seule boucle while (PollEvent) gérant la fermeture du programme sur tout le long du jeu ?
Mon "Main.cc"
Et voici mon "jouer.cc" :
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 #include <iostream> #include <cstdlib> #include <string> #include <SDL.h> #include <SDL_image.h> #include <sstream> #include <SDL/SDL_ttf.h> #include <SDL_ttf.h> #include "menu.h" #include "jouer.h" #include "image.h" using namespace std; SDL_Surface *ecran;//Initialisation de l'écran SDL_Event evennement;//Initialisation des évènements à venir sur la fenêtre SD int main () { bool quit=false; bool play; SDL_Init(SDL_INIT_EVERYTHING); ecran=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE); play = menu();//J'appelle ici mon menu qui demande à l'utilisateur de jouer ou de //quitter, c'est un booléen retournant play while(!quit) { while(SDL_PollEvent(&evennement))//1er appel de mon PollEvent { if( evennement.type == SDL_QUIT ) { quit = true; } if (play) jouer();//On lance le jeu contenu dans un autre fichier else quit = true; } } return 0; }
A noter que nous sommes obligés de fragmenter ainsi notre code cela fait partie des eigeances de nos professeurs.
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 #include <iostream> #include <cstdlib> #include <string> #include <SDL.h> #include <SDL_image.h> #include <sstream> #include <SDL/SDL_ttf.h> #include <SDL_ttf.h> #include "jouer.h" using namespace std; SDL_Surface *surfaceJeu; extern SDL_Event evennement;//J'appelle le SDL-Event déclaré dans le main extern SDL_Surface *canard; void jouer() { int cptPhaseVol =0; Canard c; bool quit=false; applySurface( 0, 0, surfaceJeu, screen, NULL ); surfaceJeu = load_image( "backGame.png"); c.canard = loadImageWithColorKey ("duck.png",228,255,0); initImageCanard (c); initCanard(c); while(SDL_PollEvent(&evennement))//Deuxieme boucle PollEvent { if( evennement.type == SDL_QUIT ) { quit = true; } if (!quit) { if (cptPhaseVol == 0) c.canLect = c.NDos1; else if (cptPhaseVol==50) c.canLect = c.NDos2; else if(cptPhaseVol == 100) c.canLect = c.NDos3; else if (cptPhaseVol >150) cptPhaseVol =0; applySurface( 0, 0, surfaceJeu, screen, NULL ); applySurface( c.x, c.y, c.canard, screen,&c.canLect ); SDL_Flip(screen); moveCanard(c); showCanard(c, screen); SDL_FreeSurface(screen); cptPhaseVol++; } } }
Par ailleurs, le code est très loin d'être terminé, ce soucis me blogue légèrement pour continuer la suite.
Enfin, dans mon menu.cc (non affiché ici), j'ai également appelé une autre boucle while (PollEvent).
Cette dernière n'affecte cependant pas le bon déroulement du programme,hors-mis peut-être une perte d'optimisation de l'execution.
Je ne sais pas si c'est vraiment très clair, n'hésitez pas à me demander de clarifier certains points si necéssaire.
Merci par avance!
Cordialement.
Partager