diff --git a/source/director.cpp b/source/director.cpp index f2b478c..60df752 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -101,8 +101,7 @@ void Director::init() bindInputs(); // Asigna los controles a la entrada del sistema ServiceMenu::init(); // Inicializa el menú de servicio 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 } // Cierra todo y libera recursos del sistema y de los singletons diff --git a/source/resource.cpp b/source/resource.cpp index f72e4a4..2a79fc7 100644 --- a/source/resource.cpp +++ b/source/resource.cpp @@ -42,8 +42,9 @@ void Resource::clear() // Carga todos los recursos del juego y muestra el progreso de carga void Resource::load() { - // Calcula el total de recursos a cargar - calculateTotal(); + // Prepara la gestión del progreso de carga + calculateTotalResources(); + initProgressBar(); // Muerstra la ventana y desactiva el sincronismo vertical 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 -void Resource::calculateTotal() +void Resource::calculateTotalResources() { const std::array ASSET_TYPES = { AssetType::SOUND, @@ -427,30 +428,32 @@ void Resource::calculateTotal() // Muestra el progreso de carga en pantalla (barra y texto) void Resource::renderProgress() { + // Obtiene la pantalla y el renderer auto screen = Screen::get(); auto renderer = screen->getRenderer(); + // Actualiza la lógica principal de la pantalla (input, etc.) screen->coreUpdate(); - constexpr float X_PADDING = 10.0f; - constexpr float Y_PADDING = 10.0f; - constexpr float BAR_HEIGHT = 10.0f; - const float BAR_Y_POSITION = param.game.height - BAR_HEIGHT - Y_PADDING; - + // Inicia el frame y limpia la pantalla screen->start(); screen->clean(); + + // Establece el color de dibujo a blanco SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); - const float wired_bar_width = param.game.width - (X_PADDING * 2); - SDL_FRect rect_wired = {X_PADDING, BAR_Y_POSITION, wired_bar_width, X_PADDING}; - SDL_RenderRect(renderer, &rect_wired); + // Dibuja la barra de progreso (marco y barra llena) + SDL_RenderRect(renderer, &loading_wired_rect_); + SDL_RenderFillRect(renderer, &loading_full_rect_); - const float full_bar_width = wired_bar_width * loading_count_.getPercentage(); - SDL_FRect rect_full = {X_PADDING, BAR_Y_POSITION, full_bar_width, X_PADDING}; - SDL_RenderFillRect(renderer, &rect_full); - - loading_text_->write(X_PADDING, BAR_Y_POSITION - 9, "Loading : " + loading_resource_name_); + // Escribe el texto de carga encima de la barra + loading_text_->write( + loading_wired_rect_.x, + loading_wired_rect_.y - 9, + "Loading : " + loading_resource_name_ + ); + // Renderiza el frame en pantalla screen->coreRender(); } @@ -479,7 +482,29 @@ void Resource::checkEvents() void Resource::updateLoadingProgress(std::string name) { loading_resource_name_ = name; - loading_count_.add(1); + loading_count_.increase(); + updateProgressBar(); renderProgress(); 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(); } \ No newline at end of file diff --git a/source/resource.h b/source/resource.h index ff0d97b..fc45e42 100644 --- a/source/resource.h +++ b/source/resource.h @@ -97,6 +97,7 @@ private: ResourceCount(size_t total) : total(total), loaded(0) {} void add(size_t amount) { loaded += amount; } + void increase() { loaded++; } float getPercentage() const { return total > 0 ? static_cast(loaded) / static_cast(total) : 0.0f; @@ -119,6 +120,8 @@ private: ResourceCount loading_count_; // Contador de recursos cargados std::shared_ptr loading_text_; // Texto para escribir en pantalla 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 --- void loadSounds(); // Carga los sonidos @@ -136,10 +139,12 @@ private: void clearMusics(); // Vacía el vector de músicas // --- 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 checkEvents(); // Comprueba los eventos durante la 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) --- Resource(); // Constructor privado