Files
projecte_2026/source/game/entities/door.hpp
Sergio Valor 8ebf7894f2 - afegides claus i portes al editor
- fix: crear una nova habitació no modificava la memoria, soles els fitxers
2026-04-10 18:34:04 +02:00

67 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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
#ifdef _DEBUG
void setPosition(float x, float y); // Mueve sprite y collider en vivo (editor; NO toca CollisionMap)
#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
bool is_paused_{false}; // Indica si la puerta está pausada
};