colisions bala-enemic
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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ó
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user