Fase 1: Refactorización de Room - Extracción de gestión de entidades

Extraída la gestión de enemigos e items de Room a managers dedicados,
reduciendo las responsabilidades de la clase Room y mejorando la
separación de concernimientos.

Cambios principales:
- Creado EnemyManager para gestionar enemigos (creación, update, render, colisión)
- Creado ItemManager para gestionar items (creación, update, render, colisión, pickup)
- Room ahora delega toda la gestión de entidades a estos managers
- Room mantiene su interfaz pública sin cambios (retrocompatibilidad total)
- Eliminados vectores enemies_ e items_ de Room (reemplazados por managers)

Archivos nuevos:
- source/game/gameplay/enemy_manager.hpp/cpp
- source/game/gameplay/item_manager.hpp/cpp

Archivos modificados:
- source/game/gameplay/room.hpp/cpp
- CMakeLists.txt

Estado:
- Compilación exitosa
- Carga de assets verificada (325 assets OK)
- Linters ejecutados (clang-tidy y cppcheck)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-13 08:19:59 +01:00
parent 477ab34057
commit 2f90338214
9 changed files with 275 additions and 41 deletions

View File

@@ -14,6 +14,8 @@
#include "core/resources/resource_cache.hpp" // Para Resource
#include "core/resources/resource_helper.hpp" // Para ResourceHelper
#include "core/system/debug.hpp" // Para Debug
#include "game/gameplay/enemy_manager.hpp" // Para EnemyManager
#include "game/gameplay/item_manager.hpp" // Para ItemManager
#include "game/gameplay/item_tracker.hpp" // Para ItemTracker
#include "game/gameplay/scoreboard.hpp" // Para Scoreboard::Data
#include "game/options.hpp" // Para Options, OptionsStats, options
@@ -24,6 +26,11 @@
Room::Room(const std::string& room_path, std::shared_ptr<Scoreboard::Data> data)
: data_(std::move(std::move(data))) {
auto room = Resource::Cache::get()->getRoom(room_path);
// Crea los managers de enemigos e items
enemy_manager_ = std::make_unique<EnemyManager>();
item_manager_ = std::make_unique<ItemManager>(room->name, data_);
initializeRoom(*room);
openTheJail(); // Abre la Jail si se da el caso
@@ -34,6 +41,9 @@ Room::Room(const std::string& room_path, std::shared_ptr<Scoreboard::Data> data)
Screen::get()->setBorderColor(stringToColor(border_color_)); // Establece el color del borde
}
// Destructor
Room::~Room() = default;
void Room::initializeRoom(const Data& room) {
// Asignar valores a las variables miembro
number_ = room.number;
@@ -55,12 +65,12 @@ void Room::initializeRoom(const Data& room) {
is_paused_ = false;
time_accumulator_ = 0.0F;
// Crear los enemigos
// Crear los enemigos usando el manager
for (const auto& enemy_data : room.enemies) {
enemies_.emplace_back(std::make_shared<Enemy>(enemy_data));
enemy_manager_->addEnemy(std::make_shared<Enemy>(enemy_data));
}
// Crear los items
// Crear los items usando el manager
for (const auto& item : room.items) {
const SDL_FPoint ITEM_POS = {item.x, item.y};
@@ -71,7 +81,7 @@ void Room::initializeRoom(const Data& room) {
item_copy.color2 = stringToColor(item_color2_);
// Crear el objeto Item usando la copia modificada
items_.emplace_back(std::make_shared<Item>(item_copy));
item_manager_->addItem(std::make_shared<Item>(item_copy));
}
}
}
@@ -179,16 +189,12 @@ void Room::renderMap() {
// Dibuja los enemigos en pantalla
void Room::renderEnemies() {
for (const auto& enemy : enemies_) {
enemy->render();
}
enemy_manager_->render();
}
// Dibuja los objetos en pantalla
void Room::renderItems() {
for (const auto& item : items_) {
item->render();
}
item_manager_->render();
}
// Actualiza las variables y objetos de la habitación
@@ -204,15 +210,17 @@ void Room::update(float delta_time) {
// Actualiza los tiles animados
updateAnimatedTiles();
for (const auto& enemy : enemies_) {
// Actualiza los enemigos
enemy->update(delta_time);
}
// Actualiza los enemigos usando el manager
enemy_manager_->update(delta_time);
for (const auto& item : items_) {
// Actualiza los items
item->update(delta_time);
}
// Actualiza los items usando el manager
item_manager_->update(delta_time);
}
// Pone el mapa en modo pausa
void Room::setPaused(bool value) {
is_paused_ = value;
item_manager_->setPaused(value);
}
// Devuelve la cadena del fichero de la habitación contigua segun el borde
@@ -288,25 +296,12 @@ auto Room::getTile(int index) -> Tile {
// Indica si hay colision con un enemigo a partir de un rectangulo
auto Room::enemyCollision(SDL_FRect& rect) -> bool {
return std::ranges::any_of(enemies_, [&rect](const auto& enemy) {
return checkCollision(rect, enemy->getCollider());
});
return enemy_manager_->checkCollision(rect);
}
// Indica si hay colision con un objeto a partir de un rectangulo
auto Room::itemCollision(SDL_FRect& rect) -> bool {
for (int i = 0; i < static_cast<int>(items_.size()); ++i) {
if (checkCollision(rect, items_.at(i)->getCollider())) {
ItemTracker::get()->addItem(name_, items_.at(i)->getPos());
items_.erase(items_.begin() + i);
Audio::get()->playSound("item.wav", Audio::Group::GAME);
data_->items++;
Options::stats.items = data_->items;
return true;
}
}
return false;
return item_manager_->checkCollision(rect);
}
// Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile
@@ -780,9 +775,7 @@ auto Room::checkRightSlopes(SDL_FPoint& p) -> bool {
void Room::openTheJail() {
if (data_->jail_is_open && name_ == "THE JAIL") {
// Elimina el último enemigo (Bry debe ser el último enemigo definido en el fichero)
if (!enemies_.empty()) {
enemies_.pop_back();
}
enemy_manager_->removeLastEnemy();
// Abre las puertas
constexpr int TILE_A = 16 + (13 * 32);