Skip to content

Commit 5ccdec0

Browse files
committed
Élémination des Aliens quand tir, retirer de l'affichage + calcul du score correct
1 parent f166d39 commit 5ccdec0

2 files changed

Lines changed: 72 additions & 3 deletions

File tree

src/model/game.c

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,77 @@ void freeGame(Game *game) {
4848
free(game);
4949
}
5050

51+
void checkCollisions(Game *game, int screenWidth, int screenHeight) {
52+
if (game->playerShootX == -1 || game->playerShootY < 0)
53+
return;
54+
55+
// Calculer le scale
56+
double scale = (double)(screenWidth) / 640 + (double)(screenHeight) / 480;
57+
58+
// Convertir la position du tir en pixels
59+
double playerSizeX = 13 * scale;
60+
double shootPixelX = game->playerShootX * (screenWidth - playerSizeX * 2) + playerSizeX;
61+
double shootPixelY = game->playerShootY * (screenHeight - (20 + 8 * scale) * 2) + 20 + 8 * scale / 2.0;
62+
63+
// Hitbox en pixels responsive
64+
const double ALIEN_HITBOX_X = 10 * scale; // Largeur
65+
const double ALIEN_HITBOX_Y = 8 * scale; // Hauteur
66+
67+
for (unsigned i = 0; i < game->nbAlienRows; i++) {
68+
for (unsigned j = 0; j < game->nbAliens; j++) {
69+
unsigned k = j + i * game->nbAliens;
70+
71+
// Verif si alien mort
72+
if (game->aliens[k] < 0)
73+
continue;
74+
75+
// Calcul position exacte de l'alien en pixels
76+
double alienPixelX = ((screenWidth - 100) / (double)(game->nbAliens)) * j + 50 + game->aliensX * 100;
77+
double alienPixelY = 100 + 50 * i + game->aliensY * 150;
78+
79+
// Distance en pixels entre le tir et l'alien
80+
double distX = fabs(shootPixelX - alienPixelX);
81+
double distY = fabs(shootPixelY - alienPixelY);
82+
83+
// Vérifier la collision
84+
if (distX < ALIEN_HITBOX_X && distY < ALIEN_HITBOX_Y) {
85+
// L'alien est touché !
86+
int alienType = game->aliens[k] / 2;
87+
game->aliens[k] = -1; // Il est dead !
88+
89+
// Supprimer le tir
90+
game->playerShootX = -1;
91+
game->playerShootY = -1;
92+
93+
// Ajouter des points selon le type d'alien
94+
switch (alienType) {
95+
case 0: game->score += 10; break; // Alien Poulpe
96+
case 1: game->score += 20; break; // Alien Crabe
97+
case 2: game->score += 40; break; // Alien Pieuvre
98+
default: game->score += 100; break; // Alien Rouge (faire la règle du mod(15))
99+
}
100+
101+
return; // Un tir ne peut toucher qu'un seul alien
102+
}
103+
}
104+
}
105+
}
106+
51107
void nextFrame(Game *game) {
52108
game->frame = (game->frame + 1) % game->frameMax;
53109

54110
// Player shoot
55111
if (game->playerShootX != -1 && game->playerShootY >= 0) {
56112
game->playerShootY -= SHOOT_SPEED;
57-
if (game->playerShootY <= 0)
113+
114+
// Vérifier les collisions à chaque frame avec les dimensions de l'écran
115+
// On utilise 1280x720 comme référence (WIDTH et HEIGHT de sdl-view.h)
116+
checkCollisions(game, 1280, 720);
117+
118+
if (game->playerShootY <= 0) {
58119
game->playerShootY = -1;
120+
game->playerShootX = -1;
121+
}
59122
}
60123

61124
// Next tick
@@ -97,4 +160,4 @@ void playerShoot(Game *game) {
97160
return;
98161
game->playerShootX = game->playerPosition;
99162
game->playerShootY = 1;
100-
}
163+
}

src/views/sdl-view.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,13 @@ void updateGameSdl(Controller *controller) {
258258
// Aliens
259259
for (unsigned i = 0; i < game->nbAlienRows; i++) {
260260
for (unsigned j = 0; j < game->nbAliens; j++) {
261-
unsigned alienIndex = game->aliens[j + i * game->nbAliens];
261+
unsigned k = j + i * game->nbAliens;
262+
int alienIndex = game->aliens[k];
263+
264+
// Ne pas afficher les aliens morts
265+
if (alienIndex < 0)
266+
continue;
267+
262268
SDL_Texture *alienTexture = aliensTextures[alienIndex / 2][0];
263269

264270
float alienSizeX, alienSizeY;

0 commit comments

Comments
 (0)