Commit 3ab4f73aad534dd0d0bc6237750935c29ecc7313
1 parent
0cc8564c
Amelioration Collisions et Deplacements
Showing
9 changed files
with
203 additions
and
156 deletions
Show diff stats
Interactif/Interactif.c
... | ... | @@ -8,23 +8,24 @@ |
8 | 8 | |
9 | 9 | #define TailleX 500 |
10 | 10 | #define TailleY 500 |
11 | +#define Sol 475 | |
11 | 12 | #define ErreurHitbox 2 |
12 | 13 | |
13 | 14 | |
14 | 15 | int CheckCollisionEntiteEntite(struct entite enti1, int L1, int H1, struct entite enti2, int L2, int H2) |
15 | 16 | { |
16 | 17 | //CheckX |
17 | - int gauche1 = enti1.posx + ErreurHitbox; | |
18 | - int droite1 = enti1.posx + L1 - ErreurHitbox; | |
19 | - int gauche2 = enti2.posx + ErreurHitbox; | |
20 | - int droite2 = enti2.posx + L2 - ErreurHitbox; | |
18 | + int gauche1 = enti1.posx - L1/2 + ErreurHitbox; | |
19 | + int droite1 = enti1.posx + L1/2 - ErreurHitbox; | |
20 | + int gauche2 = enti2.posx - L2/2 + ErreurHitbox; | |
21 | + int droite2 = enti2.posx + L2/2 - ErreurHitbox; | |
21 | 22 | int CheckX = (gauche1 >= gauche2 && gauche1 <= droite2) || (droite1 >= gauche2 && droite1 <= droite2); |
22 | 23 | |
23 | 24 | //CheckY |
24 | - int haut1 = enti1.posy + ErreurHitbox; | |
25 | - int bas1 = enti1.posy + H1 - ErreurHitbox; | |
26 | - int haut2 = enti2.posy + ErreurHitbox; | |
27 | - int bas2 = enti2.posy + H2 - ErreurHitbox; | |
25 | + int haut1 = enti1.posy - H1/2 + ErreurHitbox; | |
26 | + int bas1 = enti1.posy + H1/2 - ErreurHitbox; | |
27 | + int haut2 = enti2.posy - H2/2 + ErreurHitbox; | |
28 | + int bas2 = enti2.posy + H2/2 - ErreurHitbox; | |
28 | 29 | int CheckY = (haut1 <= bas2 && haut1 >= haut2) || (bas1 <= bas2 && bas1 >= haut2); |
29 | 30 | |
30 | 31 | return CheckX && CheckY; |
... | ... | @@ -85,61 +86,16 @@ void SupprimerEntitesEnCollision(struct liste_entite** Liste1, int L1, int H1, s |
85 | 86 | |
86 | 87 | if (collision != NULL) { |
87 | 88 | // Récupération des entités impliquées |
88 | - struct entite enti1 = collision->enti; | |
89 | - struct entite enti2 = collision->suivant->enti; | |
89 | + struct entite* enti1 = &collision->enti; | |
90 | + struct entite* enti2 = &collision->suivant->enti; | |
90 | 91 | |
91 | - //Suppression de l'entité 1 de la liste 1 | |
92 | - | |
93 | - //precedant1 garde en memoire l'element precedant de la liste | |
94 | - struct liste_entite* precedant1 = NULL; | |
95 | - //courant1 garde en memoire l'element courant de la liste | |
96 | - struct liste_entite* courant1 = *Liste1; | |
97 | - | |
98 | - while (courant1 != NULL) | |
99 | - { | |
100 | - //Comparaison des entites avec memcmp | |
101 | - if (memcmp(&courant1->enti, &enti1, sizeof(struct entite)) == 0) | |
102 | - { | |
103 | - //Si l'element à supprimer est le 1er de la liste | |
104 | - if (precedant1 == NULL) | |
105 | - { | |
106 | - *Liste1 = courant1->suivant; | |
107 | - } | |
108 | - else | |
109 | - { | |
110 | - precedant1->suivant = courant1->suivant; | |
111 | - } | |
112 | - free(courant1); | |
113 | - break; | |
114 | - } | |
115 | - | |
116 | - precedant1 = courant1; | |
117 | - courant1 = courant1->suivant; | |
118 | - } | |
92 | + // Suppression de l'entité 1 de la liste 1 | |
93 | + SupprimerEntite(Liste1, enti1); | |
119 | 94 | |
120 | 95 | // Suppression de l'entité 2 de la liste 2 |
121 | - struct liste_entite* precedant2 = NULL; | |
122 | - struct liste_entite* courant2 = *Liste2; | |
96 | + SupprimerEntite(Liste2, enti2); | |
123 | 97 | |
124 | - while (courant2 != NULL) | |
125 | - { | |
126 | - if (memcmp(&courant2->enti, &enti2, sizeof(struct entite)) == 0) | |
127 | - { | |
128 | - if (precedant2 == NULL) | |
129 | - { | |
130 | - *Liste2 = courant2->suivant; | |
131 | - } else | |
132 | - { | |
133 | - precedant2->suivant = courant2->suivant; | |
134 | - } | |
135 | - free(courant2); | |
136 | - break; | |
137 | - } | |
138 | - | |
139 | - precedant2 = courant2; | |
140 | - courant2 = courant2->suivant; | |
141 | - } | |
142 | - afficherLutin(bouillie, enti2.posx - L1/2 - ErreurHitbox, enti2.posy); | |
98 | + afficherLutin(bouillie, enti2->posx - hitboxbouillieL/2 + ErreurHitbox, enti2->posy - hitboxbouillieH/2 + ErreurHitbox); | |
143 | 99 | } |
144 | 100 | } |
145 | 101 | |
... | ... | @@ -151,34 +107,32 @@ void Tirer(struct entite joueur, struct liste_entite **pl) |
151 | 107 | { |
152 | 108 | if (*pl==NULL) |
153 | 109 | { |
154 | - ajout_tete(pl,creer_entite(joueur.posx+hitboxcanonL/2-2*ErreurHitbox,joueur.posy,0)); | |
110 | + ajout_tete(pl,creer_entite(joueur.posx,joueur.posy,-1)); | |
155 | 111 | } |
156 | 112 | } |
157 | 113 | |
158 | 114 | |
159 | - | |
160 | - | |
161 | - | |
162 | -void DeplacementTire(int tire, struct liste_entite **l) { | |
163 | - struct liste_entite *ml = *l; | |
164 | - while (ml != NULL) | |
115 | +void DeplacementTire(int tire, struct liste_entite** l) | |
116 | +{ | |
117 | + struct entite* ml = &(*l)->enti; | |
118 | + if (ml != NULL) | |
165 | 119 | { |
166 | - if (ml->enti.posy <= 0) | |
120 | + if (ml->posy <= 0) | |
167 | 121 | { |
168 | - *l = ml->suivant; | |
169 | - afficherLutin(bouillie, ml->enti.posx - hitboxbouillieL / 2, ml->enti.posy); | |
170 | - free(ml); | |
171 | - ml = *l; | |
122 | + afficherLutin(bouillie, ml->posx - hitboxbouillieL/2 + ErreurHitbox, ml->posy); | |
123 | + SupprimerEntite(l, ml); | |
172 | 124 | } |
173 | 125 | else |
174 | 126 | { |
175 | - ml->enti.posy -= 5; | |
176 | - afficherLutin(tire, ml->enti.posx, ml->enti.posy); | |
177 | - ml = ml->suivant; | |
127 | + ml->posy -= 5; | |
128 | + //Je divise ErreurHitbox par 2 car l'erreur du missile est plus petite que pour les autres images | |
129 | + afficherLutin(tire, ml->posx - hitboxmissileL/2 + ErreurHitbox/2, ml->posy - hitboxmissileH/2 + ErreurHitbox/2); | |
178 | 130 | } |
179 | 131 | } |
180 | 132 | } |
181 | 133 | |
134 | + | |
135 | + | |
182 | 136 | |
183 | 137 | char touche() |
184 | 138 | { |
... | ... | @@ -214,3 +168,59 @@ void action(struct entite *joueur, char c, struct liste_entite **tires) |
214 | 168 | } |
215 | 169 | } |
216 | 170 | |
171 | + | |
172 | + | |
173 | +void MakeBombeDroppable(struct liste_entite* enemies, struct liste_entite** bombes) | |
174 | +{ | |
175 | + struct liste_entite* pL = enemies; | |
176 | + struct liste_entite* Dropable = NULL; | |
177 | + int taille = 0; | |
178 | + while (pL != NULL) | |
179 | + { | |
180 | + if (pL->enti.dropbombe == 1) | |
181 | + { | |
182 | + ajout_tete(&Dropable,pL->enti); | |
183 | + taille += 1; | |
184 | + } | |
185 | + pL=pL->suivant; | |
186 | + } | |
187 | + | |
188 | + if(Dropable == NULL) | |
189 | + { | |
190 | + return; | |
191 | + } | |
192 | + | |
193 | + int randomIndex = rand() % taille-1; | |
194 | + struct liste_entite* pLDropable = Dropable; | |
195 | + | |
196 | + for (int i = 0; i <= randomIndex; i++) | |
197 | + { | |
198 | + pLDropable = pLDropable->suivant; | |
199 | + } | |
200 | + ajout_tete(bombes,creer_entite(pLDropable->enti.posx,pLDropable->enti.posy,-1)); | |
201 | +} | |
202 | + | |
203 | + | |
204 | +void DeplacementBombe(int bombe, struct liste_entite** l) | |
205 | +{ | |
206 | + struct liste_entite* ml = *l; | |
207 | + struct liste_entite* precedent = NULL; | |
208 | + | |
209 | + while (ml != NULL) | |
210 | + { | |
211 | + if (ml->enti.posy + hitboxbombeH - ErreurHitbox >= Sol) | |
212 | + { | |
213 | + struct entite* a_supprimer = &ml->enti; | |
214 | + ml = ml->suivant; | |
215 | + SupprimerEntite(l, a_supprimer); | |
216 | + } | |
217 | + else | |
218 | + { | |
219 | + ml->enti.posy += 2; | |
220 | + afficherLutin(bombe, ml->enti.posx - hitboxbombeL/2 + ErreurHitbox, ml->enti.posy); | |
221 | + precedent = ml; | |
222 | + ml = ml->suivant; | |
223 | + } | |
224 | + } | |
225 | +} | |
226 | + | ... | ... |
Interactif/Interactif.h
... | ... | @@ -17,3 +17,7 @@ void SupprimerEntitesEnCollision(struct liste_entite**,int,int,struct liste_enti |
17 | 17 | char touche(); |
18 | 18 | |
19 | 19 | void action(struct entite*,char,struct liste_entite**); |
20 | + | |
21 | +void MakeBombeDroppable(struct liste_entite*,struct liste_entite**); | |
22 | + | |
23 | +void DeplacementBombe(int,struct liste_entite**); | ... | ... |
ListeC/Liste.c
1 | 1 | #include <stdio.h> |
2 | 2 | #include <stdlib.h> |
3 | +#include <string.h> | |
3 | 4 | #include "Liste.h" |
4 | 5 | |
5 | 6 | |
6 | -struct entite creer_entite(int x, int y, int etage) | |
7 | +struct entite creer_entite(int x, int y, int bombe) | |
7 | 8 | { |
8 | 9 | struct entite e; |
9 | - e.posx=x; | |
10 | - e.posy=y; | |
11 | - e.etage=etage; | |
10 | + e.posx = x; | |
11 | + e.posy = y; | |
12 | + e.dropbombe = bombe; | |
12 | 13 | return e; |
13 | 14 | } |
14 | 15 | |
... | ... | @@ -35,40 +36,29 @@ void imprimer_liste(struct liste_entite *l) |
35 | 36 | } |
36 | 37 | |
37 | 38 | |
38 | -void Supprimerentite(struct liste_entite** l, struct liste_entite* suppr) | |
39 | + | |
40 | +void SupprimerEntite(struct liste_entite** Liste, struct entite* enti) | |
39 | 41 | { |
40 | - //Liste ou Element NULL | |
41 | - if(*l == NULL || suppr == NULL) | |
42 | - { | |
43 | - return; | |
44 | - } | |
45 | - | |
46 | - //Dernier et Seul élément | |
47 | - if (*l == suppr && suppr->suivant == NULL) | |
48 | - { | |
49 | - *l = NULL; | |
50 | - return; | |
51 | - } | |
42 | + struct liste_entite* courant = *Liste; | |
43 | + struct liste_entite* precedent = NULL; | |
52 | 44 | |
53 | - //1er element | |
54 | - if(*l == suppr) | |
45 | + while (courant != NULL) | |
55 | 46 | { |
56 | - *l=suppr->suivant; | |
57 | - } | |
58 | - | |
59 | - else | |
60 | - { | |
61 | - struct liste_entite* precedent = *l; | |
62 | - while(precedent->suivant != NULL && precedent->suivant != suppr) | |
47 | + if (memcmp(&courant->enti, enti, sizeof(struct entite)) == 0) | |
63 | 48 | { |
64 | - precedent=precedent->suivant; | |
49 | + if (precedent == NULL) | |
50 | + { | |
51 | + *Liste = courant->suivant; | |
52 | + } | |
53 | + else | |
54 | + { | |
55 | + precedent->suivant = courant->suivant; | |
56 | + } | |
57 | + free(courant); | |
58 | + break; | |
65 | 59 | } |
66 | - | |
67 | - if(precedent->suivant == NULL) | |
68 | - { | |
69 | - return ; | |
70 | - } | |
71 | - precedent->suivant = suppr->suivant; | |
60 | + precedent = courant; | |
61 | + courant = courant->suivant; | |
72 | 62 | } |
73 | - free(suppr); | |
74 | 63 | } |
64 | + | ... | ... |
ListeC/Liste.h
1 | 1 | #include <stdio.h> |
2 | 2 | #include <stdlib.h> |
3 | 3 | |
4 | +//dropbombe concerne les entités enemies | |
5 | +//1 les enemies peuvent drop des bombes, 0 ils ne peuvent pas | |
6 | +//Celles non concernées vallent -1 | |
4 | 7 | struct entite |
5 | 8 | { |
6 | 9 | int posx; |
7 | 10 | int posy; |
8 | - int etage; | |
11 | + int dropbombe; | |
9 | 12 | }; |
10 | 13 | |
11 | 14 | |
... | ... | @@ -22,4 +25,5 @@ struct entite creer_entite(int,int,int); |
22 | 25 | |
23 | 26 | void imprimer_liste(struct liste_entite*); |
24 | 27 | |
25 | -void Supprimerentite(struct liste_entite**, struct liste_entite*); | |
28 | +void SupprimerEntite(struct liste_entite**,struct entite*); | |
29 | + | ... | ... |
Main/init.c
... | ... | @@ -7,25 +7,33 @@ |
7 | 7 | |
8 | 8 | #define TailleX 500 |
9 | 9 | #define TailleY 500 |
10 | +#define ErreurHitbox 2 | |
11 | +#define JoueurX TailleX/2 | |
12 | +#define JoueurY 9*TailleY/10 | |
13 | + | |
14 | +struct entite joueur = {JoueurX,JoueurY,-1}; | |
15 | + | |
16 | +int canon=0; | |
17 | +int missile=0; | |
18 | +int sbire=0; | |
19 | +int bouillie=0; | |
20 | +int bombe=0; | |
10 | 21 | |
11 | -int canon; | |
12 | -int missile; | |
13 | -int sbire; | |
14 | -int bouillie; | |
15 | 22 | |
16 | -struct entite joueur; | |
17 | 23 | |
18 | 24 | char Nom[15]="Space Invader"; |
19 | 25 | char input='\0'; |
20 | 26 | |
21 | -int hitboxcanonL; | |
22 | -int hitboxcanonH; | |
23 | -int hitboxmissileL; | |
24 | -int hitboxmissileH; | |
25 | -int hitboxsbireL; | |
26 | -int hitboxsbireH; | |
27 | -int hitboxbouillieL; | |
28 | -int hitboxbouillieH; | |
27 | +int hitboxcanonL=0; | |
28 | +int hitboxcanonH=0; | |
29 | +int hitboxmissileL=0; | |
30 | +int hitboxmissileH=0; | |
31 | +int hitboxsbireL=0; | |
32 | +int hitboxsbireH=0; | |
33 | +int hitboxbouillieL=0; | |
34 | +int hitboxbouillieH=0; | |
35 | +int hitboxbombeL=0; | |
36 | +int hitboxbombeH=0; | |
29 | 37 | |
30 | 38 | |
31 | 39 | |
... | ... | @@ -35,17 +43,14 @@ void initialiser() |
35 | 43 | missile = chargerLutin("../../Lutins/invader_missile.bmp",COULEUR_NOIR); |
36 | 44 | sbire = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR); |
37 | 45 | bouillie = chargerLutin("../../Lutins/invader_monstre_bouillie.bmp",COULEUR_NOIR); |
46 | + bombe = chargerLutin("../../Lutins/invader_bombe.bmp",COULEUR_NOIR); | |
38 | 47 | |
39 | 48 | tailleLutin(canon,&hitboxcanonL,&hitboxcanonH); |
40 | 49 | tailleLutin(missile,&hitboxmissileL,&hitboxmissileH); |
41 | 50 | tailleLutin(sbire,&hitboxsbireL,&hitboxsbireH); |
42 | 51 | tailleLutin(bouillie,&hitboxbouillieL,&hitboxbouillieH); |
52 | + tailleLutin(bombe,&hitboxbombeL,&hitboxbombeH); | |
43 | 53 | |
44 | -#define JoueurX TailleX/2-hitboxcanonL/2 | |
45 | -#define JoueurY 9*TailleY/10 | |
46 | - | |
47 | - joueur.posx = JoueurX; | |
48 | - joueur.posy = JoueurY ; | |
49 | 54 | } |
50 | 55 | |
51 | 56 | ... | ... |
Main/init.h
... | ... | @@ -5,6 +5,7 @@ extern int canon; |
5 | 5 | extern int missile; |
6 | 6 | extern int sbire; |
7 | 7 | extern int bouillie; |
8 | +extern int bombe; | |
8 | 9 | |
9 | 10 | extern struct entite joueur; |
10 | 11 | extern char Nom[15]; |
... | ... | @@ -18,6 +19,8 @@ extern int hitboxsbireL; |
18 | 19 | extern int hitboxsbireH; |
19 | 20 | extern int hitboxbouillieL; |
20 | 21 | extern int hitboxbouillieH; |
22 | +extern int hitboxbombeL; | |
23 | +extern int hitboxbombeH; | |
21 | 24 | |
22 | 25 | void initialiser(); |
23 | 26 | char pagedemarrage(); | ... | ... |
Main/main.c
... | ... | @@ -22,15 +22,18 @@ int main() |
22 | 22 | |
23 | 23 | struct liste_entite *enemies = NULL; |
24 | 24 | struct liste_entite *tires = NULL; |
25 | + struct liste_entite *bombes = NULL; | |
25 | 26 | |
26 | 27 | char texte[15]="SCORE : "; |
27 | 28 | int Score = lutinTexte(texte,COULEUR_BLANC); |
28 | 29 | |
29 | 30 | |
30 | - LigneSbire(&enemies,3,1); | |
31 | + LigneSbire(&enemies,8,3); | |
31 | 32 | int SensVague=1; |
32 | 33 | |
33 | - int compt=0; | |
34 | + int compteur=0; | |
35 | + int DropAlea=0; | |
36 | + int CheckAlea=0; | |
34 | 37 | |
35 | 38 | if (pagedemarrage() != 'j') |
36 | 39 | { |
... | ... | @@ -45,27 +48,42 @@ int main() |
45 | 48 | rectanglePlein(0,Sol,TailleX,2,COULEUR_VERT); |
46 | 49 | afficherLutin(Score,0,Sol+ErreurHitbox); |
47 | 50 | |
48 | - afficherLutin(canon,joueur.posx,joueur.posy); | |
49 | - | |
50 | - if(compt==10) | |
51 | + afficherLutin(canon,joueur.posx - hitboxcanonL/2 + ErreurHitbox,joueur.posy); | |
52 | + | |
53 | + if (DropAlea == 0) | |
51 | 54 | { |
52 | - DeplacementSbire(enemies,&SensVague,1); | |
53 | - compt=0; | |
55 | + DropAlea = rand() % 31 + 100; | |
54 | 56 | } |
55 | - AfficherSbire(sbire,enemies); | |
56 | - | |
57 | + if (CheckAlea == DropAlea) | |
58 | + { | |
59 | + MakeBombeDroppable(enemies,&bombes); | |
60 | + DropAlea=0; | |
61 | + CheckAlea=0; | |
62 | + } | |
63 | + | |
64 | + AfficherSbire(sbire,hitboxsbireL,hitboxsbireH,enemies); | |
65 | + | |
57 | 66 | input = touche(); |
58 | 67 | action(&joueur,input,&tires); |
59 | 68 | |
69 | + if (compteur==10) | |
70 | + { | |
71 | + DeplacementSbire(enemies,&SensVague,1); | |
72 | + compteur=0; | |
73 | + } | |
74 | + | |
60 | 75 | DeplacementTire(missile,&tires); |
61 | 76 | |
77 | + DeplacementBombe(bombe,&bombes); | |
78 | + | |
62 | 79 | SupprimerEntitesEnCollision(&tires,hitboxmissileL,hitboxmissileH,&enemies,hitboxsbireL,hitboxsbireH); |
63 | 80 | |
64 | 81 | majSurface(); |
65 | 82 | |
66 | 83 | SDL_Delay(20); |
67 | 84 | |
68 | - compt+=1; | |
85 | + compteur+=1; | |
86 | + CheckAlea+=1; | |
69 | 87 | } |
70 | 88 | return 0; |
71 | 89 | } | ... | ... |
Monstre/Monstre.c
... | ... | @@ -6,8 +6,9 @@ |
6 | 6 | |
7 | 7 | #define TailleX 500 |
8 | 8 | #define TailleY 500 |
9 | +#define ErreurHitbox 2 | |
9 | 10 | |
10 | -//sens 1 = Va vers la droite | |
11 | +//Sens = 1 -> Va vers la droite | |
11 | 12 | void DeplacementSbire(struct liste_entite *l, int *psens, int speed) |
12 | 13 | { |
13 | 14 | int ind=0; |
... | ... | @@ -50,28 +51,40 @@ void DeplacementSbire(struct liste_entite *l, int *psens, int speed) |
50 | 51 | |
51 | 52 | |
52 | 53 | |
53 | -void AfficherSbire(int lutin,struct liste_entite *l) | |
54 | -{ | |
55 | - struct liste_entite *ml=l; | |
56 | - while(ml != NULL) | |
57 | - { | |
58 | - afficherLutin(lutin,ml->enti.posx,ml->enti.posy); | |
59 | - ml=ml->suivant; | |
60 | - } | |
61 | -} | |
62 | - | |
63 | - | |
64 | - | |
65 | 54 | void LigneSbire(struct liste_entite **enemies,int nbr_enemies, int nbr_rangee) |
66 | 55 | { |
67 | - for (int j=1; j<=nbr_rangee; j++) | |
56 | + for (int j=1; j<= nbr_rangee; j++) | |
68 | 57 | { |
69 | 58 | int compteurY=j*TailleY/10; |
70 | 59 | int compteurX=TailleX/nbr_enemies; |
60 | + | |
71 | 61 | for (int i=0; i<nbr_enemies; i++) |
72 | 62 | { |
73 | - ajout_tete(enemies,creer_entite(compteurX,compteurY,j)); | |
74 | - compteurX +=2*TailleX/(3*nbr_enemies); | |
63 | + if (j == nbr_rangee) | |
64 | + { | |
65 | + ajout_tete(enemies,creer_entite(compteurX,compteurY,1)); | |
66 | + compteurX +=2*TailleX/(3*nbr_enemies); | |
67 | + } | |
68 | + else | |
69 | + { | |
70 | + ajout_tete(enemies,creer_entite(compteurX,compteurY,0)); | |
71 | + compteurX +=2*TailleX/(3*nbr_enemies); | |
72 | + } | |
75 | 73 | } |
76 | 74 | } |
77 | 75 | } |
76 | + | |
77 | + | |
78 | + | |
79 | + | |
80 | +void AfficherSbire(int lutin, int L, int H, struct liste_entite *l) | |
81 | +{ | |
82 | + struct liste_entite *ml=l; | |
83 | + while(ml != NULL) | |
84 | + { | |
85 | + afficherLutin(lutin,ml->enti.posx - L/2 + ErreurHitbox,ml->enti.posy - H/2 + ErreurHitbox); | |
86 | + ml=ml->suivant; | |
87 | + } | |
88 | +} | |
89 | + | |
90 | + | ... | ... |
Monstre/Monstre.h