From 9ceb21c04f88aa7151b64ec1ab1518898b54bd27 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 2 Dec 2025 13:22:26 +0100 Subject: [PATCH] colisions bala-enemic --- source/game/escenes/escena_joc.cpp | 60 ++++++++++++++++++++++++++++++ source/game/escenes/escena_joc.hpp | 1 + 2 files changed, 61 insertions(+) diff --git a/source/game/escenes/escena_joc.cpp b/source/game/escenes/escena_joc.cpp index 4e1487e..622b09c 100644 --- a/source/game/escenes/escena_joc.cpp +++ b/source/game/escenes/escena_joc.cpp @@ -126,6 +126,9 @@ void EscenaJoc::actualitzar(float delta_time) { bala.actualitzar(delta_time); } + // Detectar col·lisions bala-enemic (Fase 10) + detectar_col·lisions_bales_enemics(); + // Actualitzar fragments d'explosions debris_manager_.actualitzar(delta_time); } @@ -245,3 +248,60 @@ void EscenaJoc::dibuixar_marcador() { // Renderitzar text_.render(text, {x, y}, escala, spacing); } + +void EscenaJoc::detectar_col·lisions_bales_enemics() { + // Constants amplificades per hitbox més generós (115%) + constexpr float RADI_BALA = Defaults::Entities::BULLET_RADIUS; + constexpr float RADI_ENEMIC = Defaults::Entities::ENEMY_RADIUS; + constexpr float SUMA_RADIS = (RADI_BALA + RADI_ENEMIC) * 1.15f; // 28.75 px + constexpr float SUMA_RADIS_QUADRAT = SUMA_RADIS * SUMA_RADIS; // 826.56 + + // Velocitat d'explosió reduïda per efecte suau + constexpr float VELOCITAT_EXPLOSIO = 50.0f; // px/s (en lloc de 80.0f per defecte) + + // Iterar per totes les bales actives + for (auto& bala : bales_) { + if (!bala.esta_activa()) { + continue; + } + + const Punt& pos_bala = bala.get_centre(); + + // Comprovar col·lisió amb tots els enemics actius + for (auto& enemic : orni_) { + if (!enemic.esta_actiu()) { + continue; + } + + const Punt& pos_enemic = enemic.get_centre(); + + // Calcular distància quadrada (evita sqrt) + float dx = pos_bala.x - pos_enemic.x; + float dy = pos_bala.y - pos_enemic.y; + float distancia_quadrada = dx * dx + dy * dy; + + // Comprovar col·lisió + if (distancia_quadrada <= SUMA_RADIS_QUADRAT) { + // *** COL·LISIÓ DETECTADA *** + + // 1. Destruir enemic (marca com inactiu) + enemic.destruir(); + + // 2. Crear explosió de fragments + debris_manager_.explotar( + enemic.get_forma(), // Forma vectorial del pentàgon + pos_enemic, // Posició central + 0.0f, // Angle (enemic té rotació interna) + 1.0f, // Escala normal + VELOCITAT_EXPLOSIO // 50 px/s (explosió suau) + ); + + // 3. Desactivar bala + bala.desactivar(); + + // 4. Eixir del bucle intern (bala només destrueix 1 enemic) + break; + } + } + } +} diff --git a/source/game/escenes/escena_joc.hpp b/source/game/escenes/escena_joc.hpp index 3142b0b..cad086f 100644 --- a/source/game/escenes/escena_joc.hpp +++ b/source/game/escenes/escena_joc.hpp @@ -49,6 +49,7 @@ class EscenaJoc { // Funcions privades void tocado(); + void detectar_col·lisions_bales_enemics(); // Col·lisions bala-enemic void dibuixar_marges() const; // Dibuixar vores de la zona de joc void dibuixar_marcador(); // Dibuixar marcador de puntuació };