Commit 579e0a0f43e1ea123c4d47fdbd409222831cdabf
1 parent
8959b9d7
rapport intermediaire
Showing
1 changed file
with
240 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,240 @@ | @@ -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 | + |