@@ -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+
51107void 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+ }
0 commit comments