Files
jaildoctors_dilemma/source/game/gameplay/item_manager.cpp
Sergio 2f90338214 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>
2025-11-13 08:19:59 +01:00

70 lines
2.0 KiB
C++

#include "item_manager.hpp"
#include "../../core/audio/audio.hpp" // Para Audio
#include "../../utils/utils.hpp" // Para checkCollision
#include "../entities/item.hpp" // Para Item
#include "item_tracker.hpp" // Para ItemTracker
#include "scoreboard.hpp" // Para Scoreboard::Data
#include "../options.hpp" // Para Options
// Constructor
ItemManager::ItemManager(std::string room_name, std::shared_ptr<Scoreboard::Data> scoreboard_data)
: room_name_(std::move(room_name))
, data_(std::move(scoreboard_data)) {
}
// Añade un item a la colección
void ItemManager::addItem(std::shared_ptr<Item> item) {
items_.push_back(std::move(item));
}
// Elimina todos los items
void ItemManager::clear() {
items_.clear();
}
// Actualiza todos los items
void ItemManager::update(float delta_time) {
for (const auto& item : items_) {
item->update(delta_time);
}
}
// Renderiza todos los items
void ItemManager::render() {
for (const auto& item : items_) {
item->render();
}
}
// Pausa/despausa todos los items
void ItemManager::setPaused(bool paused) {
for (const auto& item : items_) {
item->setPaused(paused);
}
}
// Comprueba si hay colisión con algún item
auto ItemManager::checkCollision(SDL_FRect& rect) -> bool {
for (int i = 0; i < static_cast<int>(items_.size()); ++i) {
if (::checkCollision(rect, items_.at(i)->getCollider())) {
// Registra el item como recogido
ItemTracker::get()->addItem(room_name_, items_.at(i)->getPos());
// Elimina el item de la colección
items_.erase(items_.begin() + i);
// Reproduce el sonido de pickup
Audio::get()->playSound("item.wav", Audio::Group::GAME);
// Actualiza el scoreboard y estadísticas
data_->items++;
Options::stats.items = data_->items;
return true;
}
}
return false;
}