Commit 66b129e56791445ce04a9417f5832e44c3798ab9
1 parent
590ac30b
Collisions Sbires Missiles Terminées
Showing
9 changed files
with
224 additions
and
65 deletions
Show diff stats
Interactif/Interactif.c
@@ -3,9 +3,79 @@ | @@ -3,9 +3,79 @@ | ||
3 | #include "../Graphique/libgraph.h" | 3 | #include "../Graphique/libgraph.h" |
4 | #include "../ListeC/Liste.h" | 4 | #include "../ListeC/Liste.h" |
5 | #include "Interactif.h" | 5 | #include "Interactif.h" |
6 | +#include "../Main/init.h" | ||
6 | 7 | ||
7 | #define TailleX 500 | 8 | #define TailleX 500 |
8 | #define TailleY 500 | 9 | #define TailleY 500 |
10 | +#define ErreurHitbox 2 | ||
11 | + | ||
12 | + | ||
13 | +int CheckCollisionEntiteEntite(struct entite enti1,int L1,int H1,struct entite enti2 ,int L2, int H2) | ||
14 | +{ | ||
15 | + //CheckX | ||
16 | + int gauche1 = enti1.posx+ErreurHitbox; | ||
17 | + int droite1 = enti1.posx+L1-ErreurHitbox; | ||
18 | + int gauche2 = enti2.posx+ErreurHitbox; | ||
19 | + int droite2 = enti2.posx+L2-ErreurHitbox; | ||
20 | + int CheckX=0; | ||
21 | + if(gauche1 >= gauche2 && gauche1 <= droite2) | ||
22 | + { | ||
23 | + CheckX=1; | ||
24 | + } | ||
25 | + else if(droite1 >= gauche2 && droite1 <= droite2) | ||
26 | + { | ||
27 | + CheckX=1; | ||
28 | + } | ||
29 | + | ||
30 | + //CheckY | ||
31 | + int haut1 = enti1.posy+ErreurHitbox; | ||
32 | + int bas1 = enti1.posy+H1-ErreurHitbox; | ||
33 | + int haut2 = enti2.posy+ErreurHitbox; | ||
34 | + int bas2 = enti2.posy+H2-ErreurHitbox; | ||
35 | + int CheckY=0; | ||
36 | + if(haut1 <= bas2 && haut1 >= haut2) | ||
37 | + { | ||
38 | + CheckY=1; | ||
39 | + } | ||
40 | + else if(bas1 <= bas2 && bas1 >= haut2) | ||
41 | + { | ||
42 | + CheckY=1; | ||
43 | + } | ||
44 | + if(CheckX+CheckY==2){return 1;} | ||
45 | + else return 0; | ||
46 | +} | ||
47 | + | ||
48 | + | ||
49 | +int CheckCollisionListeEntite(struct liste_entite *Liste1,int L1,int H1,struct entite enti2, int L2, int H2) | ||
50 | +{ | ||
51 | + struct liste_entite *pL1=Liste1; | ||
52 | + while (pL1 != NULL) | ||
53 | + { | ||
54 | + if(CheckCollisionEntiteEntite(pL1->enti,L1,H1,enti2,L2,H2) == 1) | ||
55 | + { | ||
56 | + return 1; | ||
57 | + } | ||
58 | + pL1=pL1->suivant; | ||
59 | + } | ||
60 | + return 0; | ||
61 | +} | ||
62 | + | ||
63 | + | ||
64 | +struct liste_entite* CheckCollisionListeListe(struct liste_entite *Liste1,int L1,int H1,struct liste_entite *Liste2,int L2, int H2) | ||
65 | +{ | ||
66 | + struct liste_entite *pL2=Liste2; | ||
67 | + while (pL2 != NULL) | ||
68 | + { | ||
69 | + if(CheckCollisionListeEntite(Liste1,L1,H1,pL2->enti,L2,H2) == 1) | ||
70 | + { | ||
71 | + return pL2; | ||
72 | + } | ||
73 | + else | ||
74 | + pL2=pL2->suivant; | ||
75 | + } | ||
76 | + return NULL; | ||
77 | +} | ||
78 | + | ||
9 | 79 | ||
10 | void Tirer(struct entite joueur, struct liste_entite **pl) | 80 | void Tirer(struct entite joueur, struct liste_entite **pl) |
11 | { | 81 | { |
@@ -17,7 +87,7 @@ void Tirer(struct entite joueur, struct liste_entite **pl) | @@ -17,7 +87,7 @@ void Tirer(struct entite joueur, struct liste_entite **pl) | ||
17 | } | 87 | } |
18 | 88 | ||
19 | 89 | ||
20 | -void DeplacementTire(int tire, int explo, struct liste_entite **l) | 90 | +void DeplacementTire(int tire,struct liste_entite **l) |
21 | { | 91 | { |
22 | struct liste_entite *ml = *l; | 92 | struct liste_entite *ml = *l; |
23 | while (ml != NULL) | 93 | while (ml != NULL) |
@@ -25,7 +95,7 @@ void DeplacementTire(int tire, int explo, struct liste_entite **l) | @@ -25,7 +95,7 @@ void DeplacementTire(int tire, int explo, struct liste_entite **l) | ||
25 | if (ml->enti.posy <= 0) | 95 | if (ml->enti.posy <= 0) |
26 | { | 96 | { |
27 | *l = NULL; | 97 | *l = NULL; |
28 | - afficherLutin(explo, ml->enti.posx-20, ml->enti.posy); | 98 | + afficherLutin(bouillie, ml->enti.posx-hitboxbouillieL/2, ml->enti.posy); |
29 | break; | 99 | break; |
30 | } | 100 | } |
31 | else | 101 | else |
@@ -37,6 +107,22 @@ void DeplacementTire(int tire, int explo, struct liste_entite **l) | @@ -37,6 +107,22 @@ void DeplacementTire(int tire, int explo, struct liste_entite **l) | ||
37 | } | 107 | } |
38 | } | 108 | } |
39 | 109 | ||
110 | + | ||
111 | + | ||
112 | +void SupprIfTouch(struct liste_entite **Liste1,int L1,int H1,struct liste_entite **Liste2,int L2, int H2) | ||
113 | +{ | ||
114 | + struct liste_entite *suppr = CheckCollisionListeListe(*Liste1,L1,H1,*Liste2,L2,H2); | ||
115 | + if (suppr != NULL) | ||
116 | + { | ||
117 | + int x = suppr->enti.posx-ErreurHitbox; | ||
118 | + int y = suppr->enti.posy; | ||
119 | + Supprimerentite(Liste2,suppr); | ||
120 | + majSurface(); | ||
121 | + afficherLutin(bouillie,x,y); | ||
122 | + *Liste1=NULL; | ||
123 | + } | ||
124 | +} | ||
125 | + | ||
40 | 126 | ||
41 | char touche() | 127 | char touche() |
42 | { | 128 | { |
Interactif/Interactif.h
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | 3 | ||
4 | + | ||
5 | +int CheckCollisionEntiteEntite(struct entite,int,int,struct entite,int,int); | ||
6 | + | ||
7 | +int CheckCollisionListeEntite(struct liste_entite*,int,int,struct entite,int,int); | ||
8 | + | ||
9 | +struct liste_entite* CheckCollisionListeListe(struct liste_entite*,int,int,struct liste_entite*,int,int); | ||
10 | + | ||
4 | void Tirer(struct entite, struct liste_entite**); | 11 | void Tirer(struct entite, struct liste_entite**); |
5 | 12 | ||
6 | -void DeplacementTire(int,int,struct liste_entite**); | 13 | +void DeplacementTire(int,struct liste_entite**); |
14 | + | ||
15 | +void SupprIfTouch(struct liste_entite**,int,int,struct liste_entite**,int,int); | ||
7 | 16 | ||
8 | char touche(); | 17 | char touche(); |
9 | 18 |
ListeC/Liste.c
@@ -38,4 +38,41 @@ void imprimer_liste(struct liste_entite *l) | @@ -38,4 +38,41 @@ void imprimer_liste(struct liste_entite *l) | ||
38 | printf("\n"); | 38 | printf("\n"); |
39 | } | 39 | } |
40 | 40 | ||
41 | - | 41 | + |
42 | +void Supprimerentite(struct liste_entite** l, struct liste_entite* suppr) | ||
43 | +{ | ||
44 | + //Liste ou Element NULL | ||
45 | + if(*l == NULL || suppr == NULL) | ||
46 | + { | ||
47 | + return; | ||
48 | + } | ||
49 | + | ||
50 | + //Dernier et Seul élément | ||
51 | + if (*l == suppr && suppr->suivant == NULL) | ||
52 | + { | ||
53 | + *l = NULL; | ||
54 | + return; | ||
55 | + } | ||
56 | + | ||
57 | + //1er element | ||
58 | + if(*l == suppr) | ||
59 | + { | ||
60 | + *l=suppr->suivant; | ||
61 | + } | ||
62 | + | ||
63 | + else | ||
64 | + { | ||
65 | + struct liste_entite* precedent = *l; | ||
66 | + while(precedent->suivant != NULL && precedent->suivant != suppr) | ||
67 | + { | ||
68 | + precedent=precedent->suivant; | ||
69 | + } | ||
70 | + | ||
71 | + if(precedent->suivant == NULL) | ||
72 | + { | ||
73 | + return ; | ||
74 | + } | ||
75 | + precedent->suivant = suppr->suivant; | ||
76 | + } | ||
77 | + free(suppr); | ||
78 | +} |
ListeC/Liste.h
@@ -23,3 +23,5 @@ void creer_liste(struct liste_entite*); | @@ -23,3 +23,5 @@ void creer_liste(struct liste_entite*); | ||
23 | struct entite creer_entite(int,int,int); | 23 | struct entite creer_entite(int,int,int); |
24 | 24 | ||
25 | void imprimer_liste(struct liste_entite*); | 25 | void imprimer_liste(struct liste_entite*); |
26 | + | ||
27 | +void Supprimerentite(struct liste_entite**, struct liste_entite*); |
Main/init.c
@@ -25,6 +25,8 @@ int hitboxmissileL; | @@ -25,6 +25,8 @@ int hitboxmissileL; | ||
25 | int hitboxmissileH; | 25 | int hitboxmissileH; |
26 | int hitboxsbireL; | 26 | int hitboxsbireL; |
27 | int hitboxsbireH; | 27 | int hitboxsbireH; |
28 | +int hitboxbouillieL; | ||
29 | +int hitboxbouillieH; | ||
28 | 30 | ||
29 | void initialiser() | 31 | void initialiser() |
30 | { | 32 | { |
@@ -33,15 +35,10 @@ void initialiser() | @@ -33,15 +35,10 @@ void initialiser() | ||
33 | sbire = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR); | 35 | sbire = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR); |
34 | bouillie = chargerLutin("../../Lutins/invader_monstre_bouillie.bmp",COULEUR_NOIR); | 36 | bouillie = chargerLutin("../../Lutins/invader_monstre_bouillie.bmp",COULEUR_NOIR); |
35 | 37 | ||
36 | - int* hitboxL=&hitboxcanonL; | ||
37 | - int* hitboxH=&hitboxcanonH; | ||
38 | - tailleLutin(canon,hitboxL,hitboxH); | ||
39 | - hitboxL=&hitboxmissileL; | ||
40 | - hitboxH=&hitboxmissileH; | ||
41 | - tailleLutin(canon,hitboxL,hitboxH); | ||
42 | - hitboxL=&hitboxsbireL; | ||
43 | - hitboxH=&hitboxsbireH; | ||
44 | - tailleLutin(sbire,hitboxL,hitboxH); | 38 | + tailleLutin(canon,&hitboxcanonL,&hitboxcanonH); |
39 | + tailleLutin(missile,&hitboxmissileL,&hitboxmissileH); | ||
40 | + tailleLutin(sbire,&hitboxsbireL,&hitboxsbireH); | ||
41 | + tailleLutin(bouillie,&hitboxbouillieL,&hitboxbouillieH); | ||
45 | 42 | ||
46 | #define JoueurX TailleX/2-hitboxcanonL/2 | 43 | #define JoueurX TailleX/2-hitboxcanonL/2 |
47 | #define JoueurY 9*TailleY/10 | 44 | #define JoueurY 9*TailleY/10 |
Main/init.h
@@ -16,6 +16,8 @@ extern int hitboxmissileL; | @@ -16,6 +16,8 @@ extern int hitboxmissileL; | ||
16 | extern int hitboxmissileH; | 16 | extern int hitboxmissileH; |
17 | extern int hitboxsbireL; | 17 | extern int hitboxsbireL; |
18 | extern int hitboxsbireH; | 18 | extern int hitboxsbireH; |
19 | +extern int hitboxbouillieL; | ||
20 | +extern int hitboxbouillieH; | ||
19 | 21 | ||
20 | void initialiser(); | 22 | void initialiser(); |
21 | 23 |
Main/main.c
@@ -11,42 +11,7 @@ | @@ -11,42 +11,7 @@ | ||
11 | #define TailleX 500 | 11 | #define TailleX 500 |
12 | #define TailleY 500 | 12 | #define TailleY 500 |
13 | #define Sol 475 | 13 | #define Sol 475 |
14 | - | ||
15 | -int CheckCollision(struct entite enti1,int L1,int H1,struct entite enti2 ,int L2, int H2) | ||
16 | -{ | ||
17 | - //CheckX | ||
18 | - int gauche1 = enti1.posx-L1; | ||
19 | - int droite1 = enti1.posx+L1; | ||
20 | - int gauche2 = enti2.posx-L2; | ||
21 | - int droite2 = enti2.posx+L2; | ||
22 | - int CheckX=0; | ||
23 | - if(gauche1 >= gauche2 && gauche1 <= droite2) | ||
24 | - { | ||
25 | - CheckX=1; | ||
26 | - } | ||
27 | - else if(droite1 >= gauche2 && droite1 <= droite2) | ||
28 | - { | ||
29 | - CheckX=1; | ||
30 | - } | ||
31 | - | ||
32 | - //CheckY | ||
33 | - int haut1 = enti1.posy-H1; | ||
34 | - int bas1 = enti1.posy+H1; | ||
35 | - int haut2 = enti2.posy-H2; | ||
36 | - int bas2 = enti2.posy+H2; | ||
37 | - int CheckY=0; | ||
38 | - if(haut1 >= bas2 && haut1 <= haut2) | ||
39 | - { | ||
40 | - CheckY=1; | ||
41 | - } | ||
42 | - else if(bas1 >= bas2 && bas1 <= haut2) | ||
43 | - { | ||
44 | - CheckY=1; | ||
45 | - } | ||
46 | - | ||
47 | - if(CheckX+CheckY==2){return 1;} | ||
48 | - return 0; | ||
49 | -} | 14 | +#define ErreurHitbox 2 |
50 | 15 | ||
51 | int main() | 16 | int main() |
52 | { | 17 | { |
@@ -63,11 +28,8 @@ int main() | @@ -63,11 +28,8 @@ int main() | ||
63 | Ligne_Monstre(&enemies,5); | 28 | Ligne_Monstre(&enemies,5); |
64 | int SensVague=1; | 29 | int SensVague=1; |
65 | int *psens=&SensVague; | 30 | int *psens=&SensVague; |
66 | - | ||
67 | - printf("%d",hitboxcanonL); | ||
68 | - printf("%d",hitboxsbireL); | ||
69 | - printf("%d",hitboxmissileL); | ||
70 | 31 | ||
32 | + | ||
71 | while(input!='m') | 33 | while(input!='m') |
72 | { | 34 | { |
73 | rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR); | 35 | rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR); |
@@ -80,20 +42,10 @@ int main() | @@ -80,20 +42,10 @@ int main() | ||
80 | input = touche(); | 42 | input = touche(); |
81 | action(&joueur,input,&tires); | 43 | action(&joueur,input,&tires); |
82 | 44 | ||
83 | - DeplacementTire(missile,bouillie,&tires); | 45 | + DeplacementTire(missile,&tires); |
84 | 46 | ||
85 | - /* Test | ||
86 | - struct entite missile1 = &tires->enti; | 47 | + SupprIfTouch(&tires,hitboxmissileL,hitboxmissileH,&enemies,hitboxsbireL,hitboxsbireH); |
87 | 48 | ||
88 | - struct liste_entite *p; | ||
89 | - p = enemies; | ||
90 | - while (p != NULL) | ||
91 | - { | ||
92 | - int ok = CheckCollision(missile1,hitboxmissileL,hitboxmissileH,p->enti,hitboxsbireL,hitboxsbireH); | ||
93 | - printf("%d \n",ok); | ||
94 | - p=p->suivant; | ||
95 | - } | ||
96 | - */ | ||
97 | afficherLutin(Score,0,Sol); | 49 | afficherLutin(Score,0,Sol); |
98 | 50 | ||
99 | majSurface(); | 51 | majSurface(); |
Missile/Missile.c
@@ -3,6 +3,74 @@ | @@ -3,6 +3,74 @@ | ||
3 | #include "../Graphique/libgraph.h" | 3 | #include "../Graphique/libgraph.h" |
4 | #include "../ListeC/Liste.h" | 4 | #include "../ListeC/Liste.h" |
5 | #include "Missile.h" | 5 | #include "Missile.h" |
6 | +#define ErreurHitbox 2 | ||
7 | + | ||
8 | + | ||
9 | +int CheckCollisionEntiteEntite(struct entite enti1,int L1,int H1,struct entite enti2 ,int L2, int H2) | ||
10 | +{ | ||
11 | + //CheckX | ||
12 | + int gauche1 = enti1.posx+ErreurHitbox; | ||
13 | + int droite1 = enti1.posx+L1-ErreurHitbox; | ||
14 | + int gauche2 = enti2.posx+ErreurHitbox; | ||
15 | + int droite2 = enti2.posx+L2-ErreurHitbox; | ||
16 | + int CheckX=0; | ||
17 | + if(gauche1 >= gauche2 && gauche1 <= droite2) | ||
18 | + { | ||
19 | + CheckX=1; | ||
20 | + } | ||
21 | + else if(droite1 >= gauche2 && droite1 <= droite2) | ||
22 | + { | ||
23 | + CheckX=1; | ||
24 | + } | ||
25 | + | ||
26 | + //CheckY | ||
27 | + int haut1 = enti1.posy+ErreurHitbox; | ||
28 | + int bas1 = enti1.posy+H1-ErreurHitbox; | ||
29 | + int haut2 = enti2.posy+ErreurHitbox; | ||
30 | + int bas2 = enti2.posy+H2-ErreurHitbox; | ||
31 | + int CheckY=0; | ||
32 | + if(haut1 <= bas2 && haut1 >= haut2) | ||
33 | + { | ||
34 | + CheckY=1; | ||
35 | + } | ||
36 | + else if(bas1 <= bas2 && bas1 >= haut2) | ||
37 | + { | ||
38 | + CheckY=1; | ||
39 | + } | ||
40 | + if(CheckX+CheckY==2){return 1;} | ||
41 | + else return 0; | ||
42 | +} | ||
43 | + | ||
44 | + | ||
45 | +int CheckCollisionListeEntite(struct liste_entite *Liste1,int L1,int H1,struct entite enti2, int L2, int H2) | ||
46 | +{ | ||
47 | + struct liste_entite *pL1=Liste1; | ||
48 | + while (pL1 != NULL) | ||
49 | + { | ||
50 | + if(CheckCollisionEntiteEntite(pL1->enti,L1,H1,enti2,L2,H2) == 1) | ||
51 | + { | ||
52 | + return 1; | ||
53 | + } | ||
54 | + pL1=pL1->suivant; | ||
55 | + } | ||
56 | + return 0; | ||
57 | +} | ||
58 | + | ||
59 | + | ||
60 | +int CheckCollisionListeListe(struct liste_entite *Liste1,int L1,int H1,struct liste_entite *Liste2,int L2, int H2) | ||
61 | +{ | ||
62 | + struct liste_entite *pL2=Liste2; | ||
63 | + while (pL2 != NULL) | ||
64 | + { | ||
65 | + if(CheckCollisionListeEntite(Liste1,L1,H1,pL2->enti,L2,H2) == 1) | ||
66 | + { | ||
67 | + return 1; | ||
68 | + } | ||
69 | + else | ||
70 | + pL2=pL2->suivant; | ||
71 | + } | ||
72 | + return 0; | ||
73 | +} | ||
6 | 74 | ||
7 | 75 | ||
8 | void Tirer(struct entite joueur, struct liste_entite **pl) | 76 | void Tirer(struct entite joueur, struct liste_entite **pl) |
Missile/Missile.h
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | 3 | ||
4 | +int CheckCollisionEntiteEntite(struct entite,int,int,struct entite,int,int); | ||
5 | + | ||
6 | +int CheckCollisionListeEntite(struct liste_entite*,int,int,struct entite,int,int); | ||
7 | + | ||
8 | +int CheckCollisionListeListe(struct liste_entite*,int,int,struct liste_entite*,int,int); | ||
9 | + | ||
4 | void Tirer(struct entite, struct liste_entite**); | 10 | void Tirer(struct entite, struct liste_entite**); |
5 | 11 | ||
6 | void DeplacementTire(int,struct liste_entite*); | 12 | void DeplacementTire(int,struct liste_entite*); |