Commit 66b129e56791445ce04a9417f5832e44c3798ab9

Authored by Martin CHAUVELIERE
1 parent 590ac30b

Collisions Sbires Missiles Terminées

Interactif/Interactif.c
... ... @@ -3,9 +3,79 @@
3 3 #include "../Graphique/libgraph.h"
4 4 #include "../ListeC/Liste.h"
5 5 #include "Interactif.h"
  6 +#include "../Main/init.h"
6 7  
7 8 #define TailleX 500
8 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 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 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 92 struct liste_entite *ml = *l;
23 93 while (ml != NULL)
... ... @@ -25,7 +95,7 @@ void DeplacementTire(int tire, int explo, struct liste_entite **l)
25 95 if (ml->enti.posy <= 0)
26 96 {
27 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 99 break;
30 100 }
31 101 else
... ... @@ -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 127 char touche()
42 128 {
... ...
Interactif/Interactif.h
1 1 #include <stdio.h>
2 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 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 17 char touche();
9 18  
... ...
ListeC/Liste.c
... ... @@ -38,4 +38,41 @@ void imprimer_liste(struct liste_entite *l)
38 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 23 struct entite creer_entite(int,int,int);
24 24  
25 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 25 int hitboxmissileH;
26 26 int hitboxsbireL;
27 27 int hitboxsbireH;
  28 +int hitboxbouillieL;
  29 +int hitboxbouillieH;
28 30  
29 31 void initialiser()
30 32 {
... ... @@ -33,15 +35,10 @@ void initialiser()
33 35 sbire = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR);
34 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 43 #define JoueurX TailleX/2-hitboxcanonL/2
47 44 #define JoueurY 9*TailleY/10
... ...
Main/init.h
... ... @@ -16,6 +16,8 @@ extern int hitboxmissileL;
16 16 extern int hitboxmissileH;
17 17 extern int hitboxsbireL;
18 18 extern int hitboxsbireH;
  19 +extern int hitboxbouillieL;
  20 +extern int hitboxbouillieH;
19 21  
20 22 void initialiser();
21 23  
... ...
Main/main.c
... ... @@ -11,42 +11,7 @@
11 11 #define TailleX 500
12 12 #define TailleY 500
13 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 16 int main()
52 17 {
... ... @@ -63,11 +28,8 @@ int main()
63 28 Ligne_Monstre(&enemies,5);
64 29 int SensVague=1;
65 30 int *psens=&SensVague;
66   -
67   - printf("%d",hitboxcanonL);
68   - printf("%d",hitboxsbireL);
69   - printf("%d",hitboxmissileL);
70 31  
  32 +
71 33 while(input!='m')
72 34 {
73 35 rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR);
... ... @@ -80,20 +42,10 @@ int main()
80 42 input = touche();
81 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 49 afficherLutin(Score,0,Sol);
98 50  
99 51 majSurface();
... ...
Missile/Missile.c
... ... @@ -3,6 +3,74 @@
3 3 #include "../Graphique/libgraph.h"
4 4 #include "../ListeC/Liste.h"
5 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 76 void Tirer(struct entite joueur, struct liste_entite **pl)
... ...
Missile/Missile.h
1 1 #include <stdio.h>
2 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 10 void Tirer(struct entite, struct liste_entite**);
5 11  
6 12 void DeplacementTire(int,struct liste_entite*);
... ...