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

@@ -8,7 +8,7 @@
#include "game/entities/door.hpp" // Para Door, Door::Data
class CollisionMap;
class SolidActorManager;
/**
* @brief Gestor de puertas de una habitación
@@ -18,14 +18,14 @@ class CollisionMap;
* - 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
* - Registrar cada puerta en el SolidActorManager para que sus AABBs
* participen en los sweeps de colisión del Player. El bit BLOCKS_PLAYER
* del propio Door se encarga de activar/desactivar el bloqueo al abrir.
* - Persistir el estado abierto en DoorTracker
*/
class DoorManager {
public:
DoorManager(std::string room_id, CollisionMap* collision_map);
DoorManager(std::string room_id, SolidActorManager* solid_actors);
~DoorManager() = default;
// Prohibir copia y movimiento para evitar duplicación accidental
@@ -35,7 +35,7 @@ class DoorManager {
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 addDoor(std::shared_ptr<Door> door); // Añade una puerta y la registra en el SolidActorManager
void clear(); // Elimina todas las puertas
// Actualización y renderizado
@@ -66,24 +66,20 @@ class DoorManager {
/**
* @brief Mueve la puerta indicada a (x, y) en píxeles
*
* Limpia los WALLs viejos del CollisionMap y, si la puerta sigue siendo
* bloqueante, escribe los nuevos. Encapsula el bookkeeping de tiles para
* que el editor nunca toque el CollisionMap directamente.
* Reposiciona el sprite y el AABB de la puerta. El registro en el
* SolidActorManager no cambia: el manager siempre lee el AABB actual
* del SolidActor durante los sweeps.
*/
void moveDoor(int index, float x, float y);
/**
* @brief Elimina la puerta indicada del vector y limpia sus WALLs del CollisionMap
* @brief Elimina la puerta indicada del vector y la desregistra del SolidActorManager
*/
void removeDoor(int index);
#endif
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
SolidActorManager* solid_actors_; // Referencia no propietaria al SolidActorManager de la Room
};