migrades portes i plataformes a solidActor

This commit is contained in:
2026-04-11 12:54:54 +02:00
parent 49f6ed41e6
commit 5b2f986d32
22 changed files with 686 additions and 286 deletions

View File

@@ -5,6 +5,8 @@
#include <memory> // Para shared_ptr
#include <string> // Para string
#include "game/entities/solid_actor.hpp" // Para SolidActor
class AnimatedSprite;
/**
@@ -15,12 +17,12 @@ class AnimatedSprite;
* - "opening": animación de transición que se reproduce una sola vez
* - "opened": estado final no bloqueante (frame estático)
*
* El comportamiento de "muro" se implementa marcando los 4 tiles que ocupa
* la puerta como WALL en el CollisionMap (lo gestiona el DoorManager). Cuando
* la puerta termina de abrirse, los tiles vuelven a EMPTY y el jugador puede
* pasar.
* El comportamiento de "muro" se implementa como SolidActor con flag
* BLOCKS_PLAYER. El SolidActorManager de la Room lo consulta en los sweeps
* del Player. Cuando la puerta termina de abrirse, se limpia el flag
* BLOCKS_PLAYER y el sweep deja de verla como pared.
*/
class Door {
class Door : public SolidActor {
public:
enum class State : int {
CLOSED = 0,
@@ -41,11 +43,10 @@ class Door {
void render(); // Pinta la puerta en pantalla
void update(float delta_time); // Avanza la animación; si OPENING termina → OPENED
auto getCollider() -> SDL_FRect& { return collider_; } // Rectángulo de colisión (8x32)
[[nodiscard]] auto getPos() const -> SDL_FPoint; // Posición en píxeles
[[nodiscard]] auto getId() const -> const std::string& { return id_; } // Identificador
[[nodiscard]] auto getState() const -> State { return state_; } // Estado actual
[[nodiscard]] auto isBlocking() const -> bool { return state_ != State::OPENED; } // True si bloquea al jugador
auto getCollider() -> SDL_FRect& { return aabb_; } // Rectángulo de colisión (8x32)
[[nodiscard]] auto getPos() const -> SDL_FPoint; // Posición en píxeles
[[nodiscard]] auto getId() const -> const std::string& { return id_; } // Identificador
[[nodiscard]] auto getState() const -> State { return state_; } // Estado actual
void startOpening(); // Transición CLOSED → OPENING
auto justOpened() -> bool; // Flag one-shot consumido por el manager
@@ -53,12 +54,11 @@ class Door {
void setPaused(bool paused) { is_paused_ = paused; } // Pausa/despausa la animación
#ifdef _DEBUG
void setPosition(float x, float y); // Mueve sprite y collider en vivo (editor; NO toca CollisionMap)
void setPosition(float x, float y); // Mueve sprite y AABB en vivo (editor)
#endif
private:
std::shared_ptr<AnimatedSprite> sprite_; // Sprite animado de la puerta
SDL_FRect collider_{}; // Rectángulo de colisión
std::string id_; // Identificador
State state_{State::CLOSED}; // Estado actual
bool just_opened_{false}; // Flag one-shot: la puerta acaba de transicionar a OPENED