respawn de nau i invulnerabilitat

This commit is contained in:
2025-12-10 11:35:45 +01:00
parent 9a5adcbcc5
commit 3b638f4715
5 changed files with 55 additions and 8 deletions

View File

@@ -20,7 +20,8 @@ Nau::Nau(SDL_Renderer* renderer)
angle_(0.0f),
velocitat_(0.0f),
esta_tocada_(false),
brightness_(Defaults::Brightness::NAU) {
brightness_(Defaults::Brightness::NAU),
invulnerable_timer_(0.0f) {
// [NUEVO] Carregar forma compartida des de fitxer
forma_ = Graphics::ShapeLoader::load("ship.shp");
@@ -29,7 +30,7 @@ Nau::Nau(SDL_Renderer* renderer)
}
}
void Nau::inicialitzar(const Punt* spawn_point) {
void Nau::inicialitzar(const Punt* spawn_point, bool activar_invulnerabilitat) {
// Inicialització de la nau (triangle)
// Basat en el codi Pascal original: lines 380-384
// Copiat de joc_asteroides.cpp línies 30-44
@@ -52,6 +53,14 @@ void Nau::inicialitzar(const Punt* spawn_point) {
// Estat inicial
angle_ = 0.0f;
velocitat_ = 0.0f;
// Activar invulnerabilidad solo si es respawn
if (activar_invulnerabilitat) {
invulnerable_timer_ = Defaults::Ship::INVULNERABILITY_DURATION;
} else {
invulnerable_timer_ = 0.0f;
}
esta_tocada_ = false;
}
@@ -90,6 +99,14 @@ void Nau::actualitzar(float delta_time) {
if (esta_tocada_)
return;
// Decrementar timer de invulnerabilidad
if (invulnerable_timer_ > 0.0f) {
invulnerable_timer_ -= delta_time;
if (invulnerable_timer_ < 0.0f) {
invulnerable_timer_ = 0.0f;
}
}
// Aplicar física (moviment + fricció)
aplicar_fisica(delta_time);
}
@@ -99,6 +116,19 @@ void Nau::dibuixar() const {
if (esta_tocada_)
return;
// Si invulnerable, parpadear (toggle on/off)
if (es_invulnerable()) {
// Calcular ciclo de parpadeo
float blink_cycle = Defaults::Ship::BLINK_VISIBLE_TIME +
Defaults::Ship::BLINK_INVISIBLE_TIME;
float time_in_cycle = std::fmod(invulnerable_timer_, blink_cycle);
// Si estamos en fase invisible, no dibujar
if (time_in_cycle < Defaults::Ship::BLINK_INVISIBLE_TIME) {
return; // No dibujar durante fase invisible
}
}
if (!forma_)
return;