Commit 579e0a0f43e1ea123c4d47fdbd409222831cdabf
1 parent
8959b9d7
rapport intermediaire
Showing
1 changed file
with
240 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,240 @@ |
1 | +#include<SDL/SDL.h> | |
2 | +#include<SDL/SDL_ttf.h> | |
3 | +#include"Graphique/libgraph.h" | |
4 | +#include<stdbool.h> | |
5 | +#include "main.h" | |
6 | +#include <stdio.h> | |
7 | +#include <stdlib.h> | |
8 | + | |
9 | +static SDL_Surface *surface; | |
10 | + | |
11 | +int vaisseauID = -1; | |
12 | +int envahisseurID = -1; | |
13 | +int missileID = -1; | |
14 | +int bombeID = -1; | |
15 | + | |
16 | + | |
17 | +void initListe(listeEntites* liste) { | |
18 | + liste->tete = NULL; | |
19 | +} | |
20 | + | |
21 | + | |
22 | +void ajouterEntite(listeEntites* liste, int x, int y, int type, int etat) { | |
23 | + entite* nouvelleEntite = (entite*)malloc(sizeof(entite)); | |
24 | + if (!nouvelleEntite) { | |
25 | + fprintf(stderr, "Erreur : impossible d'allouer la mémoire pour une nouvelle entité.\n"); | |
26 | + exit(EXIT_FAILURE); | |
27 | + } | |
28 | + nouvelleEntite->x = x; | |
29 | + nouvelleEntite->y = y; | |
30 | + nouvelleEntite->type = type; | |
31 | + nouvelleEntite->etat = etat; | |
32 | + nouvelleEntite->suivante = liste->tete; | |
33 | + liste->tete = nouvelleEntite; | |
34 | + printf("Ajouté entité de type %d à (%d, %d)\n", type, x, y); | |
35 | +} | |
36 | + | |
37 | + | |
38 | +void initEnvahisseurs(listeEntites* liste, int nbEnvahisseurs, int y) { | |
39 | + for (int i = 0; i < nbEnvahisseurs; i++) { | |
40 | + ajouterEntite(liste, i * 40, y, 1, 1); // Type 1 pour envahisseur | |
41 | + } | |
42 | + printf("Initialisé %d envahisseurs à la position y = %d\n", nbEnvahisseurs, y); | |
43 | +} | |
44 | + | |
45 | + | |
46 | +void initVaisseau(entite* vaisseau, int x, int y) { | |
47 | + vaisseau->x = x; | |
48 | + vaisseau->y = y; | |
49 | + vaisseau->type = 0; | |
50 | + vaisseau->etat = 1; | |
51 | + vaisseau->suivante = NULL; | |
52 | + printf("Initialisé vaisseau à (%d, %d)\n", x, y); | |
53 | +} | |
54 | + | |
55 | + | |
56 | +void deplacerEnvahisseurs(listeEntites* envahisseurs, int largeurEcran, int* direction, bool* bordAtteint) { | |
57 | + entite* courant = envahisseurs->tete; | |
58 | + while (courant != NULL) { | |
59 | + courant->x += *direction * 10; | |
60 | + | |
61 | + | |
62 | + if (courant->x <= 0 || courant->x >= largeurEcran - 40) { | |
63 | + *bordAtteint = true; | |
64 | + } | |
65 | + | |
66 | + courant = courant->suivante; | |
67 | + } | |
68 | + | |
69 | + | |
70 | + if (*bordAtteint) { | |
71 | + *direction = -*direction; | |
72 | + courant = envahisseurs->tete; | |
73 | + while (courant != NULL) { | |
74 | + courant->y += 10; | |
75 | + courant = courant->suivante; | |
76 | + } | |
77 | + *bordAtteint = false; | |
78 | + printf("Les envahisseurs ont changé de direction\n"); | |
79 | + } | |
80 | +} | |
81 | + | |
82 | + | |
83 | +void gererEntrees(entite* vaisseau, listeEntites* missiles) { | |
84 | + const Uint8* etatClavier = SDL_GetKeyState(NULL); | |
85 | + | |
86 | + if (etatClavier[SDLK_LEFT]) { | |
87 | + vaisseau->x -= 10; | |
88 | + } | |
89 | + if (etatClavier[SDLK_RIGHT]) { | |
90 | + vaisseau->x += 10; | |
91 | + } | |
92 | + if (etatClavier[SDLK_SPACE]) { | |
93 | + | |
94 | + ajouterEntite(missiles, vaisseau->x + 20, vaisseau->y - 10, 2, 1); | |
95 | + printf("Missile tiré à (%d, %d)\n", vaisseau->x + 20, vaisseau->y - 10); | |
96 | + } | |
97 | +} | |
98 | + | |
99 | + | |
100 | +bool collision(entite* a, entite* b) { | |
101 | + return (a->x < b->x + 40 && | |
102 | + a->x + 40 > b->x && | |
103 | + a->y < b->y + 40 && | |
104 | + a->y + 40 > b->y); | |
105 | +} | |
106 | + | |
107 | +entite* collisionAvecListe(entite* ent, listeEntites* liste) { | |
108 | + entite* courant = liste->tete; | |
109 | + while (courant != NULL) { | |
110 | + if (collision(ent, courant)) { | |
111 | + return courant; | |
112 | + } | |
113 | + courant = courant->suivante; | |
114 | + } | |
115 | + return NULL; | |
116 | +} | |
117 | + | |
118 | + | |
119 | +int chargerSprites() { | |
120 | + vaisseauID = chargerLutin("invader_canon.bmp", 0); | |
121 | + envahisseurID = chargerLutin("invader_monstre1_1.bmp", 1); | |
122 | + missileID = chargerLutin("invader_missile.bmp", 2); | |
123 | + bombeID = chargerLutin("invader_bombe.bmp", 3); | |
124 | + | |
125 | + if (vaisseauID < 0) { | |
126 | + fprintf(stderr, "Erreur : échec du chargement du lutin vaisseau.\n"); | |
127 | + return 0; | |
128 | + } | |
129 | + if (envahisseurID < 0) { | |
130 | + fprintf(stderr, "Erreur : échec du chargement du lutin envahisseur.\n"); | |
131 | + return 0; | |
132 | + } | |
133 | + if (missileID < 0) { | |
134 | + fprintf(stderr, "Erreur : échec du chargement du lutin missile.\n"); | |
135 | + return 0; | |
136 | + } | |
137 | + if (bombeID < 0) { | |
138 | + fprintf(stderr, "Erreur : échec du chargement du lutin bombe.\n"); | |
139 | + return 0; | |
140 | + } | |
141 | + printf("Sprites chargés avec succès\n"); | |
142 | + return 1; | |
143 | +} | |
144 | + | |
145 | + | |
146 | +void afficherEntite(entite* ent) { | |
147 | + int lutinID; | |
148 | + switch (ent->type) { | |
149 | + case 0: lutinID = vaisseauID; break; | |
150 | + case 1: lutinID = envahisseurID; break; | |
151 | + case 2: lutinID = missileID; break; | |
152 | + case 3: lutinID = bombeID; break; | |
153 | + default: | |
154 | + fprintf(stderr, "Erreur : type de lutin inconnu %d.\n", ent->type); | |
155 | + return; | |
156 | + } | |
157 | + afficherLutin(lutinID, ent->x, ent->y); | |
158 | + printf("Affichage de l'entité de type %d à (%d, %d)\n", ent->type, ent->x, ent->y); | |
159 | +} | |
160 | + | |
161 | + | |
162 | +int main() { | |
163 | + if (!creerSurface(800, 600, "Space Invaders")) { | |
164 | + fprintf(stderr, "Erreur lors de la création de la surface graphique.\n"); | |
165 | + return EXIT_FAILURE; | |
166 | + } | |
167 | + | |
168 | + if (!chargerSprites()) { | |
169 | + fprintf(stderr, "Erreur lors du chargement des sprites.\n"); | |
170 | + fermerSurface(); | |
171 | + return EXIT_FAILURE; | |
172 | + } | |
173 | + | |
174 | + listeEntites envahisseurs; | |
175 | + listeEntites missiles; | |
176 | + initListe(&envahisseurs); | |
177 | + initListe(&missiles); | |
178 | + | |
179 | + entite vaisseau; | |
180 | + initVaisseau(&vaisseau, 380, 550); | |
181 | + | |
182 | + initEnvahisseurs(&envahisseurs, 10, 50); | |
183 | + | |
184 | + int direction = 1; | |
185 | + bool bordAtteint = false; | |
186 | + | |
187 | + | |
188 | + | |
189 | +while(!getchar()) | |
190 | +{ | |
191 | + deplacerEnvahisseurs(&envahisseurs, 800, &direction, &bordAtteint); | |
192 | + entite* missile = missiles.tete; | |
193 | + while (missile != NULL) { | |
194 | + entite* cible = collisionAvecListe(missile, &envahisseurs); | |
195 | + if (cible != NULL) { | |
196 | + missile->etat = 0; | |
197 | + cible->etat = 0; | |
198 | + printf("Collision détectée entre missile et envahisseur\n"); | |
199 | + } | |
200 | + missile = missile->suivante; | |
201 | + } | |
202 | + | |
203 | + | |
204 | + | |
205 | + | |
206 | + | |
207 | + | |
208 | + entite* courant = envahisseurs.tete; | |
209 | + while (courant != NULL) { | |
210 | + if (courant->etat == 1) { | |
211 | + afficherEntite(courant); | |
212 | + } | |
213 | + courant = courant->suivante; | |
214 | + } | |
215 | + | |
216 | + if (vaisseau.etat == 1) { | |
217 | + afficherEntite(&vaisseau); | |
218 | + } | |
219 | + | |
220 | + missile = missiles.tete; | |
221 | + while (missile != NULL) { | |
222 | + if (missile->etat == 1) { | |
223 | + afficherEntite(missile); | |
224 | + } | |
225 | + missile = missile->suivante; | |
226 | + } | |
227 | + | |
228 | + SDL_Flip(surface); | |
229 | + } | |
230 | + | |
231 | + fermerSurface(); | |
232 | + return 0; | |
233 | + | |
234 | + | |
235 | +} | |
236 | +// calcul de collision entre l'ensemble des missiles et la liste d'entité | |
237 | + | |
238 | + | |
239 | + | |
240 | + | ... | ... |