treballant en sistema de portes i claus
This commit is contained in:
69
source/game/gameplay/door_manager.hpp
Normal file
69
source/game/gameplay/door_manager.hpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#include <memory> // Para shared_ptr
|
||||
#include <string> // Para string
|
||||
#include <vector> // Para vector
|
||||
|
||||
#include "game/entities/door.hpp" // Para Door, Door::Data
|
||||
|
||||
class CollisionMap;
|
||||
|
||||
/**
|
||||
* @brief Gestor de puertas de una habitación
|
||||
*
|
||||
* Responsabilidades:
|
||||
* - Almacenar y gestionar la colección de puertas
|
||||
* - Actualizar y renderizar todas las puertas
|
||||
* - Detectar contacto del jugador con puertas cerradas y disparar la apertura
|
||||
* si tiene la llave correspondiente (consultando el Inventory global)
|
||||
* - Sincronizar el estado bloqueante con el CollisionMap: cuando una puerta
|
||||
* está CLOSED u OPENING, sus 4 tiles son WALL; cuando pasa a OPENED, se
|
||||
* ponen a EMPTY
|
||||
* - Persistir el estado abierto en DoorTracker
|
||||
*/
|
||||
class DoorManager {
|
||||
public:
|
||||
DoorManager(std::string room_id, CollisionMap* collision_map);
|
||||
~DoorManager() = default;
|
||||
|
||||
// Prohibir copia y movimiento para evitar duplicación accidental
|
||||
DoorManager(const DoorManager&) = delete;
|
||||
auto operator=(const DoorManager&) -> DoorManager& = delete;
|
||||
DoorManager(DoorManager&&) = delete;
|
||||
auto operator=(DoorManager&&) -> DoorManager& = delete;
|
||||
|
||||
// Gestión de puertas
|
||||
void addDoor(std::shared_ptr<Door> door); // Añade una puerta y aplica WALLs si está cerrada
|
||||
void clear(); // Elimina todas las puertas
|
||||
|
||||
// Actualización y renderizado
|
||||
void update(float delta_time); // Actualiza animaciones y procesa transiciones a OPENED
|
||||
void render(); // Renderiza todas las puertas
|
||||
|
||||
// Estado
|
||||
void setPaused(bool paused); // Pausa/despausa todas las puertas
|
||||
|
||||
/**
|
||||
* @brief Intenta abrir las puertas cercanas al jugador si tiene la llave
|
||||
*
|
||||
* Infla el rectángulo del jugador en 1 px para detectar contacto
|
||||
* (las puertas cerradas son muros sólidos, así que el jugador queda
|
||||
* adyacente sin solapar). Para cada puerta CLOSED que solape el rect
|
||||
* inflado, si el Inventory contiene la llave correspondiente, llama a
|
||||
* door->startOpening().
|
||||
*
|
||||
* @param player_rect Rectángulo de colisión del jugador
|
||||
*/
|
||||
void tryUnlock(const SDL_FRect& player_rect);
|
||||
|
||||
private:
|
||||
static constexpr int DOOR_TILES_HEIGHT = 4; // Una puerta ocupa 4 tiles verticalmente
|
||||
|
||||
void writeDoorTiles(const Door& door, int tile_value); // Setea las 4 celdas en el CollisionMap
|
||||
|
||||
std::vector<std::shared_ptr<Door>> doors_; // Colección de puertas
|
||||
std::string room_id_; // Identificador de la habitación
|
||||
CollisionMap* collision_map_; // Referencia no propietaria al CollisionMap de la Room
|
||||
};
|
||||
Reference in New Issue
Block a user