feat(ship): la nau entra a HURT al xocar amb un enemic, mor en un segon impacte

This commit is contained in:
JailDesigner committed 2026-05-22 17:30:33 +02:00
1 parent c6560514d8
commit 87138f9a1f
5 files changed
+81 -7

No files matched your search

+21
View File
@@ -53,10 +53,31 @@ class Ship : public Entities::Entity {
body_.velocity = Vec2{}; // Detener al morir
}
// Estat "ferit": primera col·lisió amb enemic dispara HURT; segona durant HURT mata.
void herir();
[[nodiscard]] auto isHurt() const -> bool { return hurt_timer_ > 0.0F; }
[[nodiscard]] auto getHurtTimer() const -> float { return hurt_timer_; }
// Edge-trigger del contacte amb enemics: un impacte només compta a la transició
// no-tocant → tocant. Sense açò, el contacte continu durant el rebot frame-a-frame
// dispararia HURT i mort en frames consecutius.
[[nodiscard]] auto wasTouchingEnemyPrevFrame() const -> bool { return touching_enemy_prev_frame_; }
void setTouchingEnemyPrevFrame(bool touching) { touching_enemy_prev_frame_ = touching; }
private:
// Miembros específicos de Ship (heredados: renderer_, shape_, center_, angle_, brightness_, body_).
// Inicializados en la declaración: el ctor por defecto deja la nave "viva y sin invulnerabilidad",
// que es el estado coherente al que llevan tanto init() como el ctor con renderer.
bool is_hit_{false};
float invulnerable_timer_{0.0F}; // 0.0f = vulnerable, >0.0f = invulnerable
// Colors de la nau (propietats, prep per migració a YAML).
SDL_Color color_normal_{Defaults::Palette::SHIP};
SDL_Color color_hurt_{Defaults::Palette::WOUNDED};
// >0 → estat HURT (parpelleig color_normal_ ↔ color_hurt_).
float hurt_timer_{0.0F};
// Edge-trigger: true si el frame anterior la nau ja estava en contacte amb un enemic.
bool touching_enemy_prev_frame_{false};
};