colisions bala-enemic
This commit is contained in:
@@ -126,6 +126,9 @@ void EscenaJoc::actualitzar(float delta_time) {
|
|||||||
bala.actualitzar(delta_time);
|
bala.actualitzar(delta_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detectar col·lisions bala-enemic (Fase 10)
|
||||||
|
detectar_col·lisions_bales_enemics();
|
||||||
|
|
||||||
// Actualitzar fragments d'explosions
|
// Actualitzar fragments d'explosions
|
||||||
debris_manager_.actualitzar(delta_time);
|
debris_manager_.actualitzar(delta_time);
|
||||||
}
|
}
|
||||||
@@ -245,3 +248,60 @@ void EscenaJoc::dibuixar_marcador() {
|
|||||||
// Renderitzar
|
// Renderitzar
|
||||||
text_.render(text, {x, y}, escala, spacing);
|
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
|
// Funcions privades
|
||||||
void tocado();
|
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_marges() const; // Dibuixar vores de la zona de joc
|
||||||
void dibuixar_marcador(); // Dibuixar marcador de puntuació
|
void dibuixar_marcador(); // Dibuixar marcador de puntuació
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user