Blame view

Interactif/Interactif.c 6.97 KB
590ac30b   Martin CHAUVELIERE   Debut Collision
1
2
  #include <stdio.h>
  #include <stdlib.h>
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
3
  #include <string.h>
590ac30b   Martin CHAUVELIERE   Debut Collision
4
5
6
  #include "../Graphique/libgraph.h"
  #include "../ListeC/Liste.h"
  #include "Interactif.h"
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
7
  #include "../Main/init.h"
590ac30b   Martin CHAUVELIERE   Debut Collision
8
9
10
  
  #define TailleX 500
  #define TailleY 500
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
11
  #define Sol 475
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
12
13
14
  #define ErreurHitbox 2
  
  
3c835d74   Martin CHAUVELIERE   Premieres amelior...
15
  int CheckCollisionEntiteEntite(struct entite entite1, int L1, int H1, struct entite entite2, int L2, int H2)
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
16
17
  {
      //CheckX
3c835d74   Martin CHAUVELIERE   Premieres amelior...
18
19
20
21
      int gauche1 = entite1.posx - L1/2 + ErreurHitbox;
      int droite1 = entite1.posx + L1/2 - ErreurHitbox;
      int gauche2 = entite2.posx - L2/2 + ErreurHitbox;
      int droite2 = entite2.posx + L2/2 - ErreurHitbox;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
22
23
      int CheckX = (gauche1 >= gauche2 && gauche1 <= droite2) || (droite1 >= gauche2 && droite1 <= droite2);
  
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
24
      //CheckY
3c835d74   Martin CHAUVELIERE   Premieres amelior...
25
26
27
28
      int haut1 = entite1.posy - H1/2 + ErreurHitbox;
      int bas1  = entite1.posy + H1/2 - ErreurHitbox;
      int haut2 = entite2.posy - H2/2 + ErreurHitbox;
      int bas2  = entite2.posy + H2/2 - ErreurHitbox;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
29
30
31
      int CheckY = (haut1 <= bas2 && haut1 >= haut2) || (bas1 <= bas2 && bas1 >= haut2);
  
      return CheckX && CheckY;
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
32
33
34
  }
  
  
3c835d74   Martin CHAUVELIERE   Premieres amelior...
35
  struct entite* CheckCollisionListeEntite(struct liste_entite *Liste1,int L1,int H1,struct entite entite2, int L2, int H2)
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
36
37
38
39
  {
      struct liste_entite *pL1=Liste1;
      while (pL1 != NULL)
      {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
40
          if(CheckCollisionEntiteEntite(pL1->entite,L1,H1,entite2,L2,H2) == 1)
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
41
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
42
              return &pL1->entite;
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
43
44
45
          }
          pL1=pL1->suivant;
      }
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
46
      return NULL;
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
47
48
49
  }
  
  
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
50
51
  
  
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
52
53
54
55
56
  struct liste_entite* CheckCollisionListeListe(struct liste_entite *Liste1,int L1,int H1,struct liste_entite *Liste2,int L2, int H2)
  {
      struct liste_entite *pL2=Liste2;
      while (pL2 != NULL)
      {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
57
          struct entite* collision = CheckCollisionListeEntite(Liste1,L1,H1,pL2->entite,L2,H2);
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
58
          if (collision != NULL)
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
59
          {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
60
              // Création des nœuds pour les deux entités
3c835d74   Martin CHAUVELIERE   Premieres amelior...
61
62
              struct liste_entite* Entite1 = malloc(sizeof(struct liste_entite));
              struct liste_entite* Entite2 = malloc(sizeof(struct liste_entite));
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
63
64
  
              // Remplissage des nœuds avec les entités correspondantes
3c835d74   Martin CHAUVELIERE   Premieres amelior...
65
66
              Entite1->entite = *collision;
              Entite2->entite = pL2->entite;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
67
68
  
              // Relier les nœuds entre eux
3c835d74   Martin CHAUVELIERE   Premieres amelior...
69
70
              Entite1->suivant = Entite2;
              Entite2->suivant = NULL;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
71
  
3c835d74   Martin CHAUVELIERE   Premieres amelior...
72
              return Entite1;
66b129e5   Martin CHAUVELIERE   Collisions Sbires...
73
74
75
76
77
78
79
          }
          else
              pL2=pL2->suivant;
      }
      return NULL;
  }
  
590ac30b   Martin CHAUVELIERE   Debut Collision
80
  
28da2ac2   Martin CHAUVELIERE   Ajout Victoire, c...
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  void NouveauDroppeurBombe(struct liste_entite** liste, struct entite* ent)
  {
      int posx = ent->posx;
      int posy = ent->posy;
      struct liste_entite* pListe = *liste;
      struct entite* ent_bas = NULL;
  
      // On parcourt la liste et on cherche l'entité la plus basse ayant la même position x
      while (pListe != NULL) 
      {
          if (pListe->entite.posy != posy)
          {
              if (pListe->entite.posx == posx && ent_bas == NULL) 
              {
                  ent_bas = &pListe->entite;
              }
              else if (pListe->entite.posx == posx && pListe->entite.posy > ent_bas->posy)
              {
                  ent_bas = &pListe->entite;
              }
          }
           pListe = pListe->suivant;
      }    
      
      // Si aucune entité n'est située plus bas que l'entité en question, on ne peut pas dropper la bombe
      if (ent_bas == NULL)
      {
          return;
      }
      
      ent_bas->dropbombe = 1;
  }
  
  
  
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
116
117
  
  
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
118
  int SupprimerEntitesEnCollision(struct liste_entite** Liste1, int L1, int H1, struct liste_entite** Liste2, int L2, int H2) 
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
119
120
121
122
123
  {
      struct liste_entite* collision = CheckCollisionListeListe(*Liste1, L1, H1, *Liste2, L2, H2);
      
      if (collision != NULL) {
          // Récupération des entités impliquées
3c835d74   Martin CHAUVELIERE   Premieres amelior...
124
125
          struct entite* entite1 = &collision->entite;
          struct entite* entite2 = &collision->suivant->entite;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
126
          
28da2ac2   Martin CHAUVELIERE   Ajout Victoire, c...
127
128
129
130
131
132
133
134
135
          if (entite1->dropbombe == 1)
          {
              NouveauDroppeurBombe(Liste1,entite1);
          }
          
          if (entite2->dropbombe == 1)
          {
              NouveauDroppeurBombe(Liste2,entite2);
          }
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
136
          // Suppression de l'entité 1 de la liste 1
3c835d74   Martin CHAUVELIERE   Premieres amelior...
137
          SupprimerEntite(Liste1, entite1);
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
138
139
          
          // Suppression de l'entité 2 de la liste 2
3c835d74   Martin CHAUVELIERE   Premieres amelior...
140
          SupprimerEntite(Liste2, entite2);
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
141
          
3c835d74   Martin CHAUVELIERE   Premieres amelior...
142
         afficherLutin(bouillie, entite2->posx - hitboxbouillieL/2 + ErreurHitbox, entite2->posy - hitboxbouillieH/2 + ErreurHitbox);
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
143
144
         
         return 1;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
145
      }
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
146
      return 0;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
147
148
149
150
151
152
  }
  
  
  
  
  
590ac30b   Martin CHAUVELIERE   Debut Collision
153
154
  void Tirer(struct entite joueur, struct liste_entite **pl)
  {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
155
      if (*pl==NULL)
590ac30b   Martin CHAUVELIERE   Debut Collision
156
      {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
157
          ajout_tete(pl,creer_entite(joueur.posx,joueur.posy,-1));
590ac30b   Martin CHAUVELIERE   Debut Collision
158
159
160
      }
  }
      
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
161
      
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
162
163
  void DeplacementTire(int tire, struct liste_entite** l)
  {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
164
      struct entite* ml = &(*l)->entite;
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
165
      if (ml != NULL) 
590ac30b   Martin CHAUVELIERE   Debut Collision
166
      {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
167
          if (ml->posy <= 0) 
590ac30b   Martin CHAUVELIERE   Debut Collision
168
          {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
169
170
              afficherLutin(bouillie, ml->posx - hitboxbouillieL/2 + ErreurHitbox, ml->posy);
              SupprimerEntite(l, ml);
590ac30b   Martin CHAUVELIERE   Debut Collision
171
172
173
          }
          else
          {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
174
175
176
              ml->posy -= 5;
              //Je divise ErreurHitbox par 2 car l'erreur du missile est plus petite que pour les autres images
              afficherLutin(tire, ml->posx - hitboxmissileL/2 + ErreurHitbox/2, ml->posy - hitboxmissileH/2 + ErreurHitbox/2);
590ac30b   Martin CHAUVELIERE   Debut Collision
177
178
179
180
          }
      }
  }
  
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
181
182
  
  
590ac30b   Martin CHAUVELIERE   Debut Collision
183
184
185
186
187
188
189
190
191
   
  char touche()
  {
      char touche;
      evenement even;
      lireEvenement (&even,&touche,NULL);
      return touche;
  }
  
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
192
193
194
  
  
  void action(struct entite *joueur, char c, struct liste_entite **tires)
590ac30b   Martin CHAUVELIERE   Debut Collision
195
  {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
196
      switch (c) 
590ac30b   Martin CHAUVELIERE   Debut Collision
197
      {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
          case 'd':
              if (joueur->posx <= 9*TailleX/10) 
              {
                  joueur->posx += 3;
              }
              break;
          case 'q':
              if (joueur->posx >= TailleX/10) 
              {
                  joueur->posx -= 3;
              }
              break;
          case 't':
              Tirer(*joueur, tires);
              break;
          default:
              break;
590ac30b   Martin CHAUVELIERE   Debut Collision
215
      }
590ac30b   Martin CHAUVELIERE   Debut Collision
216
  }
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
217
  
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
218
219
220
221
222
223
224
225
226
  
  
  void MakeBombeDroppable(struct liste_entite* enemies, struct liste_entite** bombes)
  {
      struct liste_entite* pL = enemies;
      struct liste_entite* Dropable = NULL;
      int taille = 0;
      while (pL != NULL)
      {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
227
          if (pL->entite.dropbombe == 1)
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
228
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
229
              ajout_tete(&Dropable,pL->entite);
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
              taille += 1;
          }
          pL=pL->suivant;
      }
      
      if(Dropable == NULL)
      {
          return;
      }
          
      int randomIndex = rand() % taille-1;
      struct liste_entite* pLDropable = Dropable;
      
      for (int i = 0; i <= randomIndex; i++)
      {
          pLDropable = pLDropable->suivant;
      }    
3c835d74   Martin CHAUVELIERE   Premieres amelior...
247
      ajout_tete(bombes,creer_entite(pLDropable->entite.posx,pLDropable->entite.posy,-1));
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
248
249
250
251
252
253
254
255
256
257
  }
  
  
  void DeplacementBombe(int bombe, struct liste_entite** l) 
  {
      struct liste_entite* ml = *l;
      struct liste_entite* precedent = NULL;
      
      while (ml != NULL) 
      {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
258
          if (ml->entite.posy + hitboxbombeH/2 - ErreurHitbox >= Sol) 
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
259
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
260
              struct entite* a_supprimer = &ml->entite;
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
261
262
263
264
265
              ml = ml->suivant;
              SupprimerEntite(l, a_supprimer);
          } 
          else 
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
266
267
              ml->entite.posy += 2;
              afficherLutin(bombe, ml->entite.posx - hitboxbombeL/2 + ErreurHitbox, ml->entite.posy - hitboxbombeH/2 + ErreurHitbox);
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
268
269
270
271
272
              precedent = ml;
              ml = ml->suivant;
          }
      }
  }