forked from jaildesigner-jailgames/jaildoctors_dilemma
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user