Resource: optimitzat i netejat el proces de càrrega

This commit is contained in:
2025-06-10 23:01:29 +02:00
parent 8741f9da58
commit e6f4e27fbd
3 changed files with 49 additions and 20 deletions

View File

@@ -101,7 +101,6 @@ void Director::init()
bindInputs(); // Asigna los controles a la entrada del sistema bindInputs(); // Asigna los controles a la entrada del sistema
ServiceMenu::init(); // Inicializa el menú de servicio ServiceMenu::init(); // Inicializa el menú de servicio
Notifier::init(std::string(), Resource::get()->getText("8bithud")); // Inicialización del sistema de notificaciones Notifier::init(std::string(), Resource::get()->getText("8bithud")); // Inicialización del sistema de notificaciones
Screen::get()->getSingletons(); // Obtiene los punteros al resto de singletones Screen::get()->getSingletons(); // Obtiene los punteros al resto de singletones
} }

View File

@@ -42,8 +42,9 @@ void Resource::clear()
// Carga todos los recursos del juego y muestra el progreso de carga // Carga todos los recursos del juego y muestra el progreso de carga
void Resource::load() void Resource::load()
{ {
// Calcula el total de recursos a cargar // Prepara la gestión del progreso de carga
calculateTotal(); calculateTotalResources();
initProgressBar();
// Muerstra la ventana y desactiva el sincronismo vertical // Muerstra la ventana y desactiva el sincronismo vertical
auto screen = Screen::get(); auto screen = Screen::get();
@@ -402,7 +403,7 @@ void Resource::clearMusics()
} }
// Calcula el número total de recursos a cargar y reinicia el contador de carga // Calcula el número total de recursos a cargar y reinicia el contador de carga
void Resource::calculateTotal() void Resource::calculateTotalResources()
{ {
const std::array<AssetType, 6> ASSET_TYPES = { const std::array<AssetType, 6> ASSET_TYPES = {
AssetType::SOUND, AssetType::SOUND,
@@ -427,30 +428,32 @@ void Resource::calculateTotal()
// Muestra el progreso de carga en pantalla (barra y texto) // Muestra el progreso de carga en pantalla (barra y texto)
void Resource::renderProgress() void Resource::renderProgress()
{ {
// Obtiene la pantalla y el renderer
auto screen = Screen::get(); auto screen = Screen::get();
auto renderer = screen->getRenderer(); auto renderer = screen->getRenderer();
// Actualiza la lógica principal de la pantalla (input, etc.)
screen->coreUpdate(); screen->coreUpdate();
constexpr float X_PADDING = 10.0f; // Inicia el frame y limpia la pantalla
constexpr float Y_PADDING = 10.0f;
constexpr float BAR_HEIGHT = 10.0f;
const float BAR_Y_POSITION = param.game.height - BAR_HEIGHT - Y_PADDING;
screen->start(); screen->start();
screen->clean(); screen->clean();
// Establece el color de dibujo a blanco
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
const float wired_bar_width = param.game.width - (X_PADDING * 2); // Dibuja la barra de progreso (marco y barra llena)
SDL_FRect rect_wired = {X_PADDING, BAR_Y_POSITION, wired_bar_width, X_PADDING}; SDL_RenderRect(renderer, &loading_wired_rect_);
SDL_RenderRect(renderer, &rect_wired); SDL_RenderFillRect(renderer, &loading_full_rect_);
const float full_bar_width = wired_bar_width * loading_count_.getPercentage(); // Escribe el texto de carga encima de la barra
SDL_FRect rect_full = {X_PADDING, BAR_Y_POSITION, full_bar_width, X_PADDING}; loading_text_->write(
SDL_RenderFillRect(renderer, &rect_full); loading_wired_rect_.x,
loading_wired_rect_.y - 9,
loading_text_->write(X_PADDING, BAR_Y_POSITION - 9, "Loading : " + loading_resource_name_); "Loading : " + loading_resource_name_
);
// Renderiza el frame en pantalla
screen->coreRender(); screen->coreRender();
} }
@@ -479,7 +482,29 @@ void Resource::checkEvents()
void Resource::updateLoadingProgress(std::string name) void Resource::updateLoadingProgress(std::string name)
{ {
loading_resource_name_ = name; loading_resource_name_ = name;
loading_count_.add(1); loading_count_.increase();
updateProgressBar();
renderProgress(); renderProgress();
checkEvents(); checkEvents();
} }
// Inicializa los rectangulos que definen la barra de progreso
void Resource::initProgressBar()
{
constexpr float X_PADDING = 20.0f;
constexpr float Y_PADDING = 20.0f;
constexpr float BAR_HEIGHT = 10.0f;
const float BAR_Y_POSITION = param.game.height - BAR_HEIGHT - Y_PADDING;
const float WIRED_BAR_WIDTH = param.game.width - (X_PADDING * 2);
loading_wired_rect_ = {X_PADDING, BAR_Y_POSITION, WIRED_BAR_WIDTH, BAR_HEIGHT};
const float FULL_BAR_WIDTH = WIRED_BAR_WIDTH * loading_count_.getPercentage();
loading_full_rect_ = {X_PADDING, BAR_Y_POSITION, FULL_BAR_WIDTH, BAR_HEIGHT};
}
// Actualiza la barra de estado
void Resource::updateProgressBar()
{
loading_full_rect_.w = loading_wired_rect_.w * loading_count_.getPercentage();
}

View File

@@ -97,6 +97,7 @@ private:
ResourceCount(size_t total) : total(total), loaded(0) {} ResourceCount(size_t total) : total(total), loaded(0) {}
void add(size_t amount) { loaded += amount; } void add(size_t amount) { loaded += amount; }
void increase() { loaded++; }
float getPercentage() const float getPercentage() const
{ {
return total > 0 ? static_cast<float>(loaded) / static_cast<float>(total) : 0.0f; return total > 0 ? static_cast<float>(loaded) / static_cast<float>(total) : 0.0f;
@@ -119,6 +120,8 @@ private:
ResourceCount loading_count_; // Contador de recursos cargados ResourceCount loading_count_; // Contador de recursos cargados
std::shared_ptr<Text> loading_text_; // Texto para escribir en pantalla std::shared_ptr<Text> loading_text_; // Texto para escribir en pantalla
std::string loading_resource_name_; // Nombre del recurso que se está cargando std::string loading_resource_name_; // Nombre del recurso que se está cargando
SDL_FRect loading_wired_rect_;
SDL_FRect loading_full_rect_;
// --- Métodos internos de carga y gestión --- // --- Métodos internos de carga y gestión ---
void loadSounds(); // Carga los sonidos void loadSounds(); // Carga los sonidos
@@ -136,10 +139,12 @@ private:
void clearMusics(); // Vacía el vector de músicas void clearMusics(); // Vacía el vector de músicas
// --- Métodos internos para gestionar el progreso --- // --- Métodos internos para gestionar el progreso ---
void calculateTotal(); // Calcula el número de recursos para cargar void calculateTotalResources(); // Calcula el número de recursos para cargar
void renderProgress(); // Muestra el progreso de carga void renderProgress(); // Muestra el progreso de carga
void checkEvents(); // Comprueba los eventos durante la carga void checkEvents(); // Comprueba los eventos durante la carga
void updateLoadingProgress(std::string name); // Actualiza el progreso de carga void updateLoadingProgress(std::string name); // Actualiza el progreso de carga
void initProgressBar(); // Inicializa los rectangulos que definen la barra de progreso
void updateProgressBar(); // Actualiza la barra de estado
// --- Constructores y destructor privados (singleton) --- // --- Constructores y destructor privados (singleton) ---
Resource(); // Constructor privado Resource(); // Constructor privado