63 lines
2.7 KiB
C++
63 lines
2.7 KiB
C++
#pragma once
|
||
|
||
#include <SDL3/SDL.h>
|
||
|
||
#include <memory> // Para shared_ptr
|
||
#include <string> // Para string
|
||
|
||
class AnimatedSprite;
|
||
|
||
/**
|
||
* @brief Puerta que actúa como muro hasta que se abre con la llave correcta
|
||
*
|
||
* Entidad de 8x32 px (1 columna × 4 filas de tiles) con tres animaciones:
|
||
* - "closed": estado inicial bloqueante (frame estático)
|
||
* - "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.
|
||
*/
|
||
class Door {
|
||
public:
|
||
enum class State : int {
|
||
CLOSED = 0,
|
||
OPENING = 1,
|
||
OPENED = 2
|
||
};
|
||
|
||
struct Data {
|
||
std::string animation_path; // Ruta al fichero de animación (ej. "door1.yaml")
|
||
std::string id; // Identificador que coincide con el id de la llave que la abre
|
||
float x{0.0F}; // Posición X en píxeles (alineada al grid de 8 px)
|
||
float y{0.0F}; // Posición Y en píxeles (alineada al grid de 8 px)
|
||
};
|
||
|
||
explicit Door(const Data& data, bool start_opened);
|
||
~Door() = default;
|
||
|
||
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
|
||
|
||
void startOpening(); // Transición CLOSED → OPENING
|
||
auto justOpened() -> bool; // Flag one-shot consumido por el manager
|
||
|
||
void setPaused(bool paused) { is_paused_ = paused; } // Pausa/despausa la animación
|
||
|
||
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
|
||
bool is_paused_{false}; // Indica si la puerta está pausada
|
||
};
|