Commit 3ab4f73aad534dd0d0bc6237750935c29ecc7313

Authored by Martin CHAUVELIERE
1 parent 0cc8564c

Amelioration Collisions et Deplacements

Interactif/Interactif.c
... ... @@ -8,23 +8,24 @@
8 8  
9 9 #define TailleX 500
10 10 #define TailleY 500
  11 +#define Sol 475
11 12 #define ErreurHitbox 2
12 13  
13 14  
14 15 int CheckCollisionEntiteEntite(struct entite enti1, int L1, int H1, struct entite enti2, int L2, int H2)
15 16 {
16 17 //CheckX
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;
  18 + int gauche1 = enti1.posx - L1/2 + ErreurHitbox;
  19 + int droite1 = enti1.posx + L1/2 - ErreurHitbox;
  20 + int gauche2 = enti2.posx - L2/2 + ErreurHitbox;
  21 + int droite2 = enti2.posx + L2/2 - ErreurHitbox;
21 22 int CheckX = (gauche1 >= gauche2 && gauche1 <= droite2) || (droite1 >= gauche2 && droite1 <= droite2);
22 23  
23 24 //CheckY
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;
  25 + int haut1 = enti1.posy - H1/2 + ErreurHitbox;
  26 + int bas1 = enti1.posy + H1/2 - ErreurHitbox;
  27 + int haut2 = enti2.posy - H2/2 + ErreurHitbox;
  28 + int bas2 = enti2.posy + H2/2 - ErreurHitbox;
28 29 int CheckY = (haut1 <= bas2 && haut1 >= haut2) || (bas1 <= bas2 && bas1 >= haut2);
29 30  
30 31 return CheckX && CheckY;
... ... @@ -85,61 +86,16 @@ void SupprimerEntitesEnCollision(struct liste_entite** Liste1, int L1, int H1, s
85 86  
86 87 if (collision != NULL) {
87 88 // Récupération des entités impliquées
88   - struct entite enti1 = collision->enti;
89   - struct entite enti2 = collision->suivant->enti;
  89 + struct entite* enti1 = &collision->enti;
  90 + struct entite* enti2 = &collision->suivant->enti;
90 91  
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   - }
  92 + // Suppression de l'entité 1 de la liste 1
  93 + SupprimerEntite(Liste1, enti1);
119 94  
120 95 // Suppression de l'entité 2 de la liste 2
121   - struct liste_entite* precedant2 = NULL;
122   - struct liste_entite* courant2 = *Liste2;
  96 + SupprimerEntite(Liste2, enti2);
123 97  
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);
  98 + afficherLutin(bouillie, enti2->posx - hitboxbouillieL/2 + ErreurHitbox, enti2->posy - hitboxbouillieH/2 + ErreurHitbox);
143 99 }
144 100 }
145 101  
... ... @@ -151,34 +107,32 @@ void Tirer(struct entite joueur, struct liste_entite **pl)
151 107 {
152 108 if (*pl==NULL)
153 109 {
154   - ajout_tete(pl,creer_entite(joueur.posx+hitboxcanonL/2-2*ErreurHitbox,joueur.posy,0));
  110 + ajout_tete(pl,creer_entite(joueur.posx,joueur.posy,-1));
155 111 }
156 112 }
157 113  
158 114  
159   -
160   -
161   -
162   -void DeplacementTire(int tire, struct liste_entite **l) {
163   - struct liste_entite *ml = *l;
164   - while (ml != NULL)
  115 +void DeplacementTire(int tire, struct liste_entite** l)
  116 +{
  117 + struct entite* ml = &(*l)->enti;
  118 + if (ml != NULL)
165 119 {
166   - if (ml->enti.posy <= 0)
  120 + if (ml->posy <= 0)
167 121 {
168   - *l = ml->suivant;
169   - afficherLutin(bouillie, ml->enti.posx - hitboxbouillieL / 2, ml->enti.posy);
170   - free(ml);
171   - ml = *l;
  122 + afficherLutin(bouillie, ml->posx - hitboxbouillieL/2 + ErreurHitbox, ml->posy);
  123 + SupprimerEntite(l, ml);
172 124 }
173 125 else
174 126 {
175   - ml->enti.posy -= 5;
176   - afficherLutin(tire, ml->enti.posx, ml->enti.posy);
177   - ml = ml->suivant;
  127 + ml->posy -= 5;
  128 + //Je divise ErreurHitbox par 2 car l'erreur du missile est plus petite que pour les autres images
  129 + afficherLutin(tire, ml->posx - hitboxmissileL/2 + ErreurHitbox/2, ml->posy - hitboxmissileH/2 + ErreurHitbox/2);
178 130 }
179 131 }
180 132 }
181 133  
  134 +
  135 +
182 136  
183 137 char touche()
184 138 {
... ... @@ -214,3 +168,59 @@ void action(struct entite *joueur, char c, struct liste_entite **tires)
214 168 }
215 169 }
216 170  
  171 +
  172 +
  173 +void MakeBombeDroppable(struct liste_entite* enemies, struct liste_entite** bombes)
  174 +{
  175 + struct liste_entite* pL = enemies;
  176 + struct liste_entite* Dropable = NULL;
  177 + int taille = 0;
  178 + while (pL != NULL)
  179 + {
  180 + if (pL->enti.dropbombe == 1)
  181 + {
  182 + ajout_tete(&Dropable,pL->enti);
  183 + taille += 1;
  184 + }
  185 + pL=pL->suivant;
  186 + }
  187 +
  188 + if(Dropable == NULL)
  189 + {
  190 + return;
  191 + }
  192 +
  193 + int randomIndex = rand() % taille-1;
  194 + struct liste_entite* pLDropable = Dropable;
  195 +
  196 + for (int i = 0; i <= randomIndex; i++)
  197 + {
  198 + pLDropable = pLDropable->suivant;
  199 + }
  200 + ajout_tete(bombes,creer_entite(pLDropable->enti.posx,pLDropable->enti.posy,-1));
  201 +}
  202 +
  203 +
  204 +void DeplacementBombe(int bombe, struct liste_entite** l)
  205 +{
  206 + struct liste_entite* ml = *l;
  207 + struct liste_entite* precedent = NULL;
  208 +
  209 + while (ml != NULL)
  210 + {
  211 + if (ml->enti.posy + hitboxbombeH - ErreurHitbox >= Sol)
  212 + {
  213 + struct entite* a_supprimer = &ml->enti;
  214 + ml = ml->suivant;
  215 + SupprimerEntite(l, a_supprimer);
  216 + }
  217 + else
  218 + {
  219 + ml->enti.posy += 2;
  220 + afficherLutin(bombe, ml->enti.posx - hitboxbombeL/2 + ErreurHitbox, ml->enti.posy);
  221 + precedent = ml;
  222 + ml = ml->suivant;
  223 + }
  224 + }
  225 +}
  226 +
... ...
Interactif/Interactif.h
... ... @@ -17,3 +17,7 @@ void SupprimerEntitesEnCollision(struct liste_entite**,int,int,struct liste_enti
17 17 char touche();
18 18  
19 19 void action(struct entite*,char,struct liste_entite**);
  20 +
  21 +void MakeBombeDroppable(struct liste_entite*,struct liste_entite**);
  22 +
  23 +void DeplacementBombe(int,struct liste_entite**);
... ...
ListeC/Liste.c
1 1 #include <stdio.h>
2 2 #include <stdlib.h>
  3 +#include <string.h>
3 4 #include "Liste.h"
4 5  
5 6  
6   -struct entite creer_entite(int x, int y, int etage)
  7 +struct entite creer_entite(int x, int y, int bombe)
7 8 {
8 9 struct entite e;
9   - e.posx=x;
10   - e.posy=y;
11   - e.etage=etage;
  10 + e.posx = x;
  11 + e.posy = y;
  12 + e.dropbombe = bombe;
12 13 return e;
13 14 }
14 15  
... ... @@ -35,40 +36,29 @@ void imprimer_liste(struct liste_entite *l)
35 36 }
36 37  
37 38  
38   -void Supprimerentite(struct liste_entite** l, struct liste_entite* suppr)
  39 +
  40 +void SupprimerEntite(struct liste_entite** Liste, struct entite* enti)
39 41 {
40   - //Liste ou Element NULL
41   - if(*l == NULL || suppr == NULL)
42   - {
43   - return;
44   - }
45   -
46   - //Dernier et Seul élément
47   - if (*l == suppr && suppr->suivant == NULL)
48   - {
49   - *l = NULL;
50   - return;
51   - }
  42 + struct liste_entite* courant = *Liste;
  43 + struct liste_entite* precedent = NULL;
52 44  
53   - //1er element
54   - if(*l == suppr)
  45 + while (courant != NULL)
55 46 {
56   - *l=suppr->suivant;
57   - }
58   -
59   - else
60   - {
61   - struct liste_entite* precedent = *l;
62   - while(precedent->suivant != NULL && precedent->suivant != suppr)
  47 + if (memcmp(&courant->enti, enti, sizeof(struct entite)) == 0)
63 48 {
64   - precedent=precedent->suivant;
  49 + if (precedent == NULL)
  50 + {
  51 + *Liste = courant->suivant;
  52 + }
  53 + else
  54 + {
  55 + precedent->suivant = courant->suivant;
  56 + }
  57 + free(courant);
  58 + break;
65 59 }
66   -
67   - if(precedent->suivant == NULL)
68   - {
69   - return ;
70   - }
71   - precedent->suivant = suppr->suivant;
  60 + precedent = courant;
  61 + courant = courant->suivant;
72 62 }
73   - free(suppr);
74 63 }
  64 +
... ...
ListeC/Liste.h
1 1 #include <stdio.h>
2 2 #include <stdlib.h>
3 3  
  4 +//dropbombe concerne les entités enemies
  5 +//1 les enemies peuvent drop des bombes, 0 ils ne peuvent pas
  6 +//Celles non concernées vallent -1
4 7 struct entite
5 8 {
6 9 int posx;
7 10 int posy;
8   - int etage;
  11 + int dropbombe;
9 12 };
10 13  
11 14  
... ... @@ -22,4 +25,5 @@ struct entite creer_entite(int,int,int);
22 25  
23 26 void imprimer_liste(struct liste_entite*);
24 27  
25   -void Supprimerentite(struct liste_entite**, struct liste_entite*);
  28 +void SupprimerEntite(struct liste_entite**,struct entite*);
  29 +
... ...
Main/init.c
... ... @@ -7,25 +7,33 @@
7 7  
8 8 #define TailleX 500
9 9 #define TailleY 500
  10 +#define ErreurHitbox 2
  11 +#define JoueurX TailleX/2
  12 +#define JoueurY 9*TailleY/10
  13 +
  14 +struct entite joueur = {JoueurX,JoueurY,-1};
  15 +
  16 +int canon=0;
  17 +int missile=0;
  18 +int sbire=0;
  19 +int bouillie=0;
  20 +int bombe=0;
10 21  
11   -int canon;
12   -int missile;
13   -int sbire;
14   -int bouillie;
15 22  
16   -struct entite joueur;
17 23  
18 24 char Nom[15]="Space Invader";
19 25 char input='\0';
20 26  
21   -int hitboxcanonL;
22   -int hitboxcanonH;
23   -int hitboxmissileL;
24   -int hitboxmissileH;
25   -int hitboxsbireL;
26   -int hitboxsbireH;
27   -int hitboxbouillieL;
28   -int hitboxbouillieH;
  27 +int hitboxcanonL=0;
  28 +int hitboxcanonH=0;
  29 +int hitboxmissileL=0;
  30 +int hitboxmissileH=0;
  31 +int hitboxsbireL=0;
  32 +int hitboxsbireH=0;
  33 +int hitboxbouillieL=0;
  34 +int hitboxbouillieH=0;
  35 +int hitboxbombeL=0;
  36 +int hitboxbombeH=0;
29 37  
30 38  
31 39  
... ... @@ -35,17 +43,14 @@ void initialiser()
35 43 missile = chargerLutin("../../Lutins/invader_missile.bmp",COULEUR_NOIR);
36 44 sbire = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR);
37 45 bouillie = chargerLutin("../../Lutins/invader_monstre_bouillie.bmp",COULEUR_NOIR);
  46 + bombe = chargerLutin("../../Lutins/invader_bombe.bmp",COULEUR_NOIR);
38 47  
39 48 tailleLutin(canon,&hitboxcanonL,&hitboxcanonH);
40 49 tailleLutin(missile,&hitboxmissileL,&hitboxmissileH);
41 50 tailleLutin(sbire,&hitboxsbireL,&hitboxsbireH);
42 51 tailleLutin(bouillie,&hitboxbouillieL,&hitboxbouillieH);
  52 + tailleLutin(bombe,&hitboxbombeL,&hitboxbombeH);
43 53  
44   -#define JoueurX TailleX/2-hitboxcanonL/2
45   -#define JoueurY 9*TailleY/10
46   -
47   - joueur.posx = JoueurX;
48   - joueur.posy = JoueurY ;
49 54 }
50 55  
51 56  
... ...
Main/init.h
... ... @@ -5,6 +5,7 @@ extern int canon;
5 5 extern int missile;
6 6 extern int sbire;
7 7 extern int bouillie;
  8 +extern int bombe;
8 9  
9 10 extern struct entite joueur;
10 11 extern char Nom[15];
... ... @@ -18,6 +19,8 @@ extern int hitboxsbireL;
18 19 extern int hitboxsbireH;
19 20 extern int hitboxbouillieL;
20 21 extern int hitboxbouillieH;
  22 +extern int hitboxbombeL;
  23 +extern int hitboxbombeH;
21 24  
22 25 void initialiser();
23 26 char pagedemarrage();
... ...
Main/main.c
... ... @@ -22,15 +22,18 @@ int main()
22 22  
23 23 struct liste_entite *enemies = NULL;
24 24 struct liste_entite *tires = NULL;
  25 + struct liste_entite *bombes = NULL;
25 26  
26 27 char texte[15]="SCORE : ";
27 28 int Score = lutinTexte(texte,COULEUR_BLANC);
28 29  
29 30  
30   - LigneSbire(&enemies,3,1);
  31 + LigneSbire(&enemies,8,3);
31 32 int SensVague=1;
32 33  
33   - int compt=0;
  34 + int compteur=0;
  35 + int DropAlea=0;
  36 + int CheckAlea=0;
34 37  
35 38 if (pagedemarrage() != 'j')
36 39 {
... ... @@ -45,27 +48,42 @@ int main()
45 48 rectanglePlein(0,Sol,TailleX,2,COULEUR_VERT);
46 49 afficherLutin(Score,0,Sol+ErreurHitbox);
47 50  
48   - afficherLutin(canon,joueur.posx,joueur.posy);
49   -
50   - if(compt==10)
  51 + afficherLutin(canon,joueur.posx - hitboxcanonL/2 + ErreurHitbox,joueur.posy);
  52 +
  53 + if (DropAlea == 0)
51 54 {
52   - DeplacementSbire(enemies,&SensVague,1);
53   - compt=0;
  55 + DropAlea = rand() % 31 + 100;
54 56 }
55   - AfficherSbire(sbire,enemies);
56   -
  57 + if (CheckAlea == DropAlea)
  58 + {
  59 + MakeBombeDroppable(enemies,&bombes);
  60 + DropAlea=0;
  61 + CheckAlea=0;
  62 + }
  63 +
  64 + AfficherSbire(sbire,hitboxsbireL,hitboxsbireH,enemies);
  65 +
57 66 input = touche();
58 67 action(&joueur,input,&tires);
59 68  
  69 + if (compteur==10)
  70 + {
  71 + DeplacementSbire(enemies,&SensVague,1);
  72 + compteur=0;
  73 + }
  74 +
60 75 DeplacementTire(missile,&tires);
61 76  
  77 + DeplacementBombe(bombe,&bombes);
  78 +
62 79 SupprimerEntitesEnCollision(&tires,hitboxmissileL,hitboxmissileH,&enemies,hitboxsbireL,hitboxsbireH);
63 80  
64 81 majSurface();
65 82  
66 83 SDL_Delay(20);
67 84  
68   - compt+=1;
  85 + compteur+=1;
  86 + CheckAlea+=1;
69 87 }
70 88 return 0;
71 89 }
... ...
Monstre/Monstre.c
... ... @@ -6,8 +6,9 @@
6 6  
7 7 #define TailleX 500
8 8 #define TailleY 500
  9 +#define ErreurHitbox 2
9 10  
10   -//sens 1 = Va vers la droite
  11 +//Sens = 1 -> Va vers la droite
11 12 void DeplacementSbire(struct liste_entite *l, int *psens, int speed)
12 13 {
13 14 int ind=0;
... ... @@ -50,28 +51,40 @@ void DeplacementSbire(struct liste_entite *l, int *psens, int speed)
50 51  
51 52  
52 53  
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 54 void LigneSbire(struct liste_entite **enemies,int nbr_enemies, int nbr_rangee)
66 55 {
67   - for (int j=1; j<=nbr_rangee; j++)
  56 + for (int j=1; j<= nbr_rangee; j++)
68 57 {
69 58 int compteurY=j*TailleY/10;
70 59 int compteurX=TailleX/nbr_enemies;
  60 +
71 61 for (int i=0; i<nbr_enemies; i++)
72 62 {
73   - ajout_tete(enemies,creer_entite(compteurX,compteurY,j));
74   - compteurX +=2*TailleX/(3*nbr_enemies);
  63 + if (j == nbr_rangee)
  64 + {
  65 + ajout_tete(enemies,creer_entite(compteurX,compteurY,1));
  66 + compteurX +=2*TailleX/(3*nbr_enemies);
  67 + }
  68 + else
  69 + {
  70 + ajout_tete(enemies,creer_entite(compteurX,compteurY,0));
  71 + compteurX +=2*TailleX/(3*nbr_enemies);
  72 + }
75 73 }
76 74 }
77 75 }
  76 +
  77 +
  78 +
  79 +
  80 +void AfficherSbire(int lutin, int L, int H, struct liste_entite *l)
  81 +{
  82 + struct liste_entite *ml=l;
  83 + while(ml != NULL)
  84 + {
  85 + afficherLutin(lutin,ml->enti.posx - L/2 + ErreurHitbox,ml->enti.posy - H/2 + ErreurHitbox);
  86 + ml=ml->suivant;
  87 + }
  88 +}
  89 +
  90 +
... ...
Monstre/Monstre.h
... ... @@ -3,6 +3,6 @@
3 3  
4 4 void DeplacementSbire(struct liste_entite*,int*,int);
5 5  
6   -void AfficherSbire(int,struct liste_entite*);
7   -
8 6 void LigneSbire(struct liste_entite**,int,int);
  7 +
  8 +void AfficherSbire(int,int,int,struct liste_entite*);
... ...