Blame view

Interactif/Interactif.c 5.84 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
  
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
81
82
  
  
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
83
  int SupprimerEntitesEnCollision(struct liste_entite** Liste1, int L1, int H1, struct liste_entite** Liste2, int L2, int H2) 
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
84
85
86
87
88
  {
      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...
89
90
          struct entite* entite1 = &collision->entite;
          struct entite* entite2 = &collision->suivant->entite;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
91
          
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
92
          // Suppression de l'entité 1 de la liste 1
3c835d74   Martin CHAUVELIERE   Premieres amelior...
93
          SupprimerEntite(Liste1, entite1);
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
94
95
          
          // Suppression de l'entité 2 de la liste 2
3c835d74   Martin CHAUVELIERE   Premieres amelior...
96
          SupprimerEntite(Liste2, entite2);
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
97
          
3c835d74   Martin CHAUVELIERE   Premieres amelior...
98
         afficherLutin(bouillie, entite2->posx - hitboxbouillieL/2 + ErreurHitbox, entite2->posy - hitboxbouillieH/2 + ErreurHitbox);
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
99
100
         
         return 1;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
101
      }
4d73f71e   Martin CHAUVELIERE   Principal du jeu ...
102
      return 0;
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
103
104
105
106
107
108
  }
  
  
  
  
  
590ac30b   Martin CHAUVELIERE   Debut Collision
109
110
  void Tirer(struct entite joueur, struct liste_entite **pl)
  {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
111
      if (*pl==NULL)
590ac30b   Martin CHAUVELIERE   Debut Collision
112
      {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
113
          ajout_tete(pl,creer_entite(joueur.posx,joueur.posy,-1));
590ac30b   Martin CHAUVELIERE   Debut Collision
114
115
116
      }
  }
      
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
117
      
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
118
119
  void DeplacementTire(int tire, struct liste_entite** l)
  {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
120
      struct entite* ml = &(*l)->entite;
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
121
      if (ml != NULL) 
590ac30b   Martin CHAUVELIERE   Debut Collision
122
      {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
123
          if (ml->posy <= 0) 
590ac30b   Martin CHAUVELIERE   Debut Collision
124
          {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
125
126
              afficherLutin(bouillie, ml->posx - hitboxbouillieL/2 + ErreurHitbox, ml->posy);
              SupprimerEntite(l, ml);
590ac30b   Martin CHAUVELIERE   Debut Collision
127
128
129
          }
          else
          {
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
130
131
132
              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
133
134
135
136
          }
      }
  }
  
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
137
138
  
  
590ac30b   Martin CHAUVELIERE   Debut Collision
139
140
141
142
143
144
145
146
147
   
  char touche()
  {
      char touche;
      evenement even;
      lireEvenement (&even,&touche,NULL);
      return touche;
  }
  
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
148
149
150
  
  
  void action(struct entite *joueur, char c, struct liste_entite **tires)
590ac30b   Martin CHAUVELIERE   Debut Collision
151
  {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
152
      switch (c) 
590ac30b   Martin CHAUVELIERE   Debut Collision
153
      {
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
          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
171
      }
590ac30b   Martin CHAUVELIERE   Debut Collision
172
  }
0cc8564c   Martin CHAUVELIERE   Fin des colisions...
173
  
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
174
175
176
177
178
179
180
181
182
  
  
  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...
183
          if (pL->entite.dropbombe == 1)
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
184
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
185
              ajout_tete(&Dropable,pL->entite);
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
              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...
203
      ajout_tete(bombes,creer_entite(pLDropable->entite.posx,pLDropable->entite.posy,-1));
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
204
205
206
207
208
209
210
211
212
213
  }
  
  
  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...
214
          if (ml->entite.posy + hitboxbombeH/2 - ErreurHitbox >= Sol) 
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
215
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
216
              struct entite* a_supprimer = &ml->entite;
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
217
218
219
220
221
              ml = ml->suivant;
              SupprimerEntite(l, a_supprimer);
          } 
          else 
          {
3c835d74   Martin CHAUVELIERE   Premieres amelior...
222
223
              ml->entite.posy += 2;
              afficherLutin(bombe, ml->entite.posx - hitboxbombeL/2 + ErreurHitbox, ml->entite.posy - hitboxbombeH/2 + ErreurHitbox);
3ab4f73a   Martin CHAUVELIERE   Amelioration Coll...
224
225
226
227
228
              precedent = ml;
              ml = ml->suivant;
          }
      }
  }