Commit 0cc8564cb3163fb9bd9447db41253fc0516eb3a5

Authored by Martin CHAUVELIERE
1 parent f1ab2b42

Fin des colisions améliorées

Interactif/Interactif.c
1 1 #include <stdio.h>
2 2 #include <stdlib.h>
  3 +#include <string.h>
3 4 #include "../Graphique/libgraph.h"
4 5 #include "../ListeC/Liste.h"
5 6 #include "Interactif.h"
... ... @@ -10,65 +11,64 @@
10 11 #define ErreurHitbox 2
11 12  
12 13  
13   -int CheckCollisionEntiteEntite(struct entite enti1,int L1,int H1,struct entite enti2 ,int L2, int H2)
  14 +int CheckCollisionEntiteEntite(struct entite enti1, int L1, int H1, struct entite enti2, int L2, int H2)
14 15 {
15 16 //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   -
  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;
  21 + int CheckX = (gauche1 >= gauche2 && gauche1 <= droite2) || (droite1 >= gauche2 && droite1 <= droite2);
  22 +
30 23 //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;
  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;
  28 + int CheckY = (haut1 <= bas2 && haut1 >= haut2) || (bas1 <= bas2 && bas1 >= haut2);
  29 +
  30 + return CheckX && CheckY;
46 31 }
47 32  
48 33  
49   -int CheckCollisionListeEntite(struct liste_entite *Liste1,int L1,int H1,struct entite enti2, int L2, int H2)
  34 +struct entite* CheckCollisionListeEntite(struct liste_entite *Liste1,int L1,int H1,struct entite enti2, int L2, int H2)
50 35 {
51 36 struct liste_entite *pL1=Liste1;
52 37 while (pL1 != NULL)
53 38 {
54 39 if(CheckCollisionEntiteEntite(pL1->enti,L1,H1,enti2,L2,H2) == 1)
55 40 {
56   - return 1;
  41 + return &pL1->enti;
57 42 }
58 43 pL1=pL1->suivant;
59 44 }
60   - return 0;
  45 + return NULL;
61 46 }
62 47  
63 48  
  49 +
  50 +
64 51 struct liste_entite* CheckCollisionListeListe(struct liste_entite *Liste1,int L1,int H1,struct liste_entite *Liste2,int L2, int H2)
65 52 {
66 53 struct liste_entite *pL2=Liste2;
67 54 while (pL2 != NULL)
68 55 {
69   - if(CheckCollisionListeEntite(Liste1,L1,H1,pL2->enti,L2,H2) == 1)
  56 + struct entite* collision = CheckCollisionListeEntite(Liste1,L1,H1,pL2->enti,L2,H2);
  57 + if (collision != NULL)
70 58 {
71   - return pL2;
  59 + // Création des nœuds pour les deux entités
  60 + struct liste_entite* Enti1 = malloc(sizeof(struct liste_entite));
  61 + struct liste_entite* Enti2 = malloc(sizeof(struct liste_entite));
  62 +
  63 + // Remplissage des nœuds avec les entités correspondantes
  64 + Enti1->enti = *collision;
  65 + Enti2->enti = pL2->enti;
  66 +
  67 + // Relier les nœuds entre eux
  68 + Enti1->suivant = Enti2;
  69 + Enti2->suivant = NULL;
  70 +
  71 + return Enti1;
72 72 }
73 73 else
74 74 pL2=pL2->suivant;
... ... @@ -77,26 +77,98 @@ struct liste_entite* CheckCollisionListeListe(struct liste_entite *Liste1,int L1
77 77 }
78 78  
79 79  
  80 +
  81 +
  82 +void SupprimerEntitesEnCollision(struct liste_entite** Liste1, int L1, int H1, struct liste_entite** Liste2, int L2, int H2)
  83 +{
  84 + struct liste_entite* collision = CheckCollisionListeListe(*Liste1, L1, H1, *Liste2, L2, H2);
  85 +
  86 + if (collision != NULL) {
  87 + // Récupération des entités impliquées
  88 + struct entite enti1 = collision->enti;
  89 + struct entite enti2 = collision->suivant->enti;
  90 +
  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 + }
  119 +
  120 + // Suppression de l'entité 2 de la liste 2
  121 + struct liste_entite* precedant2 = NULL;
  122 + struct liste_entite* courant2 = *Liste2;
  123 +
  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);
  143 + }
  144 +}
  145 +
  146 +
  147 +
  148 +
  149 +
80 150 void Tirer(struct entite joueur, struct liste_entite **pl)
81 151 {
82   - struct liste_entite *ml=*pl;
83   - if (ml==NULL)
  152 + if (*pl==NULL)
84 153 {
85   - ajout_tete(pl,creer_entite(joueur.posx+18,joueur.posy-5,0));
  154 + ajout_tete(pl,creer_entite(joueur.posx+hitboxcanonL/2-2*ErreurHitbox,joueur.posy,0));
86 155 }
87 156 }
88 157  
  158 +
  159 +
  160 +
89 161  
90   -void DeplacementTire(int tire,struct liste_entite **l)
91   -{
  162 +void DeplacementTire(int tire, struct liste_entite **l) {
92 163 struct liste_entite *ml = *l;
93   - while (ml != NULL)
  164 + while (ml != NULL)
94 165 {
95   - if (ml->enti.posy <= 0)
  166 + if (ml->enti.posy <= 0)
96 167 {
97   - *l = NULL;
98   - afficherLutin(bouillie, ml->enti.posx-hitboxbouillieL/2, ml->enti.posy);
99   - break;
  168 + *l = ml->suivant;
  169 + afficherLutin(bouillie, ml->enti.posx - hitboxbouillieL / 2, ml->enti.posy);
  170 + free(ml);
  171 + ml = *l;
100 172 }
101 173 else
102 174 {
... ... @@ -107,22 +179,6 @@ void DeplacementTire(int tire,struct liste_entite **l)
107 179 }
108 180 }
109 181  
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   -
126 182  
127 183 char touche()
128 184 {
... ... @@ -132,15 +188,29 @@ char touche()
132 188 return touche;
133 189 }
134 190  
135   -void action(struct entite *joueur,char c,struct liste_entite **tires)
  191 +
  192 +
  193 +void action(struct entite *joueur, char c, struct liste_entite **tires)
136 194 {
137   - if(c=='d')
  195 + switch (c)
138 196 {
139   - if (joueur->posx<=9*TailleX/10) {joueur->posx+=3;}
140   - }
141   - if(c=='q')
142   - {
143   - if (joueur->posx>=TailleX/10) {joueur->posx-=3;}
  197 + case 'd':
  198 + if (joueur->posx <= 9*TailleX/10)
  199 + {
  200 + joueur->posx += 3;
  201 + }
  202 + break;
  203 + case 'q':
  204 + if (joueur->posx >= TailleX/10)
  205 + {
  206 + joueur->posx -= 3;
  207 + }
  208 + break;
  209 + case 't':
  210 + Tirer(*joueur, tires);
  211 + break;
  212 + default:
  213 + break;
144 214 }
145   - if(c=='t'){Tirer(*joueur,tires);}
146 215 }
  216 +
... ...
Interactif/Interactif.h
... ... @@ -4,7 +4,7 @@
4 4  
5 5 int CheckCollisionEntiteEntite(struct entite,int,int,struct entite,int,int);
6 6  
7   -int CheckCollisionListeEntite(struct liste_entite*,int,int,struct entite,int,int);
  7 +struct entite* CheckCollisionListeEntite(struct liste_entite*,int,int,struct entite,int,int);
8 8  
9 9 struct liste_entite* CheckCollisionListeListe(struct liste_entite*,int,int,struct liste_entite*,int,int);
10 10  
... ... @@ -12,7 +12,7 @@ void Tirer(struct entite, struct liste_entite**);
12 12  
13 13 void DeplacementTire(int,struct liste_entite**);
14 14  
15   -void SupprIfTouch(struct liste_entite**,int,int,struct liste_entite**,int,int);
  15 +void SupprimerEntitesEnCollision(struct liste_entite**,int,int,struct liste_entite**,int,int);
16 16  
17 17 char touche();
18 18  
... ...
ListeC/Liste.c
... ... @@ -2,17 +2,13 @@
2 2 #include <stdlib.h>
3 3 #include "Liste.h"
4 4  
5   -void creer_liste(struct liste_entite *l)
6   -{
7   - l = malloc(sizeof(struct liste_entite));
8   -}
9 5  
10   -struct entite creer_entite(int x, int y, int idd)
  6 +struct entite creer_entite(int x, int y, int etage)
11 7 {
12 8 struct entite e;
13 9 e.posx=x;
14 10 e.posy=y;
15   - e.id=idd;
  11 + e.etage=etage;
16 12 return e;
17 13 }
18 14  
... ...
ListeC/Liste.h
... ... @@ -5,7 +5,7 @@ struct entite
5 5 {
6 6 int posx;
7 7 int posy;
8   - int id;
  8 + int etage;
9 9 };
10 10  
11 11  
... ... @@ -18,8 +18,6 @@ struct liste_entite
18 18  
19 19 void ajout_tete(struct liste_entite**, struct entite);
20 20  
21   -void creer_liste(struct liste_entite*);
22   -
23 21 struct entite creer_entite(int,int,int);
24 22  
25 23 void imprimer_liste(struct liste_entite*);
... ...
Main/init.c
... ... @@ -2,6 +2,7 @@
2 2 #include <stdlib.h>
3 3 #include "../Graphique/libgraph.h"
4 4 #include "../ListeC/Liste.h"
  5 +#include "../Interactif/Interactif.h"
5 6 #include "init.h"
6 7  
7 8 #define TailleX 500
... ... @@ -12,11 +13,9 @@ int missile;
12 13 int sbire;
13 14 int bouillie;
14 15  
15   -struct liste_entite *enemies = NULL;
16   -struct liste_entite *tires = NULL;
17 16 struct entite joueur;
18 17  
19   -char Nom[20]="Space_Invader";
  18 +char Nom[15]="Space Invader";
20 19 char input='\0';
21 20  
22 21 int hitboxcanonL;
... ... @@ -28,6 +27,8 @@ int hitboxsbireH;
28 27 int hitboxbouillieL;
29 28 int hitboxbouillieH;
30 29  
  30 +
  31 +
31 32 void initialiser()
32 33 {
33 34 canon = chargerLutin("../../Lutins/invader_canon.bmp",COULEUR_NOIR);
... ... @@ -47,3 +48,36 @@ void initialiser()
47 48 joueur.posy = JoueurY ;
48 49 }
49 50  
  51 +
  52 +char pagedemarrage()
  53 +{
  54 + static const char policeDefaut[]="/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
  55 + int Largeur, Hauteur;
  56 +
  57 + rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR);
  58 + char jouer[26]="Appuyer sur j pour Jouer";
  59 + char quitter[30]="Appuyer ailleurs pour Quitter";
  60 +
  61 + choisirPolice(policeDefaut,50);
  62 + int Bienvenue = lutinTexte(Nom,COULEUR_VERT);
  63 + tailleLutin(Bienvenue,&Largeur,&Hauteur);
  64 + afficherLutin(Bienvenue,TailleX/2-Largeur/2,TailleY/4+Hauteur/2);
  65 +
  66 + choisirPolice(policeDefaut,20);
  67 +
  68 + int J = lutinTexte(jouer,COULEUR_BLANC);
  69 + tailleLutin(J,&Largeur,&Hauteur);
  70 + afficherLutin(J,TailleX/2-Largeur/2,TailleY/2-Hauteur/2);
  71 +
  72 + int Q = lutinTexte(quitter,COULEUR_BLANC);
  73 + tailleLutin(Q,&Largeur,&Hauteur);
  74 + afficherLutin(Q,TailleX/2-Largeur/2,TailleY/2+Hauteur/2);
  75 +
  76 + attendreEvenement ();
  77 + input = touche();
  78 + while (input=='\0')
  79 + {
  80 + input = touche();
  81 + }
  82 + return input;
  83 +}
... ...
Main/init.h
... ... @@ -5,11 +5,11 @@ extern int canon;
5 5 extern int missile;
6 6 extern int sbire;
7 7 extern int bouillie;
8   -extern struct liste_entite *enemies;
9   -extern struct liste_entite *tires;
  8 +
10 9 extern struct entite joueur;
11   -extern char Nom[20];
  10 +extern char Nom[15];
12 11 extern char input;
  12 +
13 13 extern int hitboxcanonL;
14 14 extern int hitboxcanonH;
15 15 extern int hitboxmissileL;
... ... @@ -20,4 +20,4 @@ extern int hitboxbouillieL;
20 20 extern int hitboxbouillieH;
21 21  
22 22 void initialiser();
23   -
  23 +char pagedemarrage();
... ...
Main/main.c
... ... @@ -18,39 +18,54 @@ int main()
18 18 creerSurface(TailleX,TailleY,Nom);
19 19  
20 20 initialiser();
  21 +
  22 +
  23 + struct liste_entite *enemies = NULL;
  24 + struct liste_entite *tires = NULL;
21 25  
22 26 char texte[15]="SCORE : ";
23   - int Score = lutinTexte(texte,COULEUR_ROUGE);
  27 + int Score = lutinTexte(texte,COULEUR_BLANC);
24 28  
25   - creer_liste(enemies);
26   - creer_liste(tires);
27 29  
28   - Ligne_Monstre(&enemies,5);
  30 + LigneSbire(&enemies,3,1);
29 31 int SensVague=1;
30   - int *psens=&SensVague;
31 32  
  33 + int compt=0;
  34 +
  35 + if (pagedemarrage() != 'j')
  36 + {
  37 + return 0;
  38 + }
32 39  
  40 +
  41 + //Bouble principale
33 42 while(input!='m')
34 43 {
35 44 rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR);
36 45 rectanglePlein(0,Sol,TailleX,2,COULEUR_VERT);
  46 + afficherLutin(Score,0,Sol+ErreurHitbox);
37 47  
38 48 afficherLutin(canon,joueur.posx,joueur.posy);
39   - DeplacementLutin(sbire,enemies,psens,1);
40   -
41 49  
  50 + if(compt==10)
  51 + {
  52 + DeplacementSbire(enemies,&SensVague,1);
  53 + compt=0;
  54 + }
  55 + AfficherSbire(sbire,enemies);
  56 +
42 57 input = touche();
43 58 action(&joueur,input,&tires);
44 59  
45 60 DeplacementTire(missile,&tires);
46 61  
47   - SupprIfTouch(&tires,hitboxmissileL,hitboxmissileH,&enemies,hitboxsbireL,hitboxsbireH);
48   -
49   - afficherLutin(Score,0,Sol);
  62 + SupprimerEntitesEnCollision(&tires,hitboxmissileL,hitboxmissileH,&enemies,hitboxsbireL,hitboxsbireH);
50 63  
51 64 majSurface();
52 65  
53 66 SDL_Delay(20);
  67 +
  68 + compt+=1;
54 69 }
55 70 return 0;
56 71 }
... ...
Monstre/Monstre.c
... ... @@ -8,7 +8,7 @@
8 8 #define TailleY 500
9 9  
10 10 //sens 1 = Va vers la droite
11   -void DeplacementLutin(int lutin,struct liste_entite *l, int *psens, int speed)
  11 +void DeplacementSbire(struct liste_entite *l, int *psens, int speed)
12 12 {
13 13 int ind=0;
14 14 struct liste_entite *ml=l;
... ... @@ -18,13 +18,11 @@ void DeplacementLutin(int lutin,struct liste_entite *l, int *psens, int speed)
18 18 {
19 19 ml->enti.posx+=speed;
20 20 if(ml->enti.posx>=9*TailleX/10)ind=1;
21   - afficherLutin(lutin,ml->enti.posx,ml->enti.posy);
22 21 }
23 22 else
24 23 {
25 24 ml->enti.posx-=speed;
26 25 if(ml->enti.posx<=TailleX/10)ind=2;
27   - afficherLutin(lutin,ml->enti.posx,ml->enti.posy);
28 26 }
29 27 ml=ml->suivant;
30 28 }
... ... @@ -51,13 +49,29 @@ void DeplacementLutin(int lutin,struct liste_entite *l, int *psens, int speed)
51 49 }
52 50  
53 51  
54   -void Ligne_Monstre(struct liste_entite **enemies,int nbr_enemies)
  52 +
  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 +void LigneSbire(struct liste_entite **enemies,int nbr_enemies, int nbr_rangee)
55 66 {
56   - int compteurY=TailleY/10;
57   - int compteurX=TailleX/nbr_enemies;
58   - for (int i=1; i<=nbr_enemies; i++)
  67 + for (int j=1; j<=nbr_rangee; j++)
59 68 {
60   - ajout_tete(enemies,creer_entite(compteurX,compteurY,0));
61   - compteurX +=2*TailleX/(3*nbr_enemies);
  69 + int compteurY=j*TailleY/10;
  70 + int compteurX=TailleX/nbr_enemies;
  71 + for (int i=0; i<nbr_enemies; i++)
  72 + {
  73 + ajout_tete(enemies,creer_entite(compteurX,compteurY,j));
  74 + compteurX +=2*TailleX/(3*nbr_enemies);
  75 + }
62 76 }
63 77 }
... ...
Monstre/Monstre.h
1 1 #include <stdio.h>
2 2 #include <stdlib.h>
3 3  
4   -void DeplacementLutin(int,struct liste_entite*,int*,int);
  4 +void DeplacementSbire(struct liste_entite*,int*,int);
5 5  
6   -void Ligne_Monstre(struct liste_entite**,int);
  6 +void AfficherSbire(int,struct liste_entite*);
  7 +
  8 +void LigneSbire(struct liste_entite**,int,int);
... ...