diff --git a/source/core/resources/resource.cpp b/source/core/resources/resource.cpp index 3301afd..079e73a 100644 --- a/source/core/resources/resource.cpp +++ b/source/core/resources/resource.cpp @@ -18,6 +18,7 @@ #include "core/rendering/text.hpp" // Para Text #include "core/resources/asset.hpp" // Para Asset #include "core/resources/resource_helper.hpp" // Para loadFile +#include "game/options.hpp" // Para Options::loading #include "utils/color.hpp" // Para Color, NO_COLOR_MOD #include "utils/param.hpp" // Para Param, param, ParamPlayer, ParamResource, ParamGame #include "utils/utils.hpp" // Para getFileName @@ -754,6 +755,12 @@ void Resource::renderProgress() { screen->start(); screen->clean(); + // Si la pantalla de carga está desactivada, dejamos todo en negro + if (!Options::loading.show) { + screen->coreRender(); + return; + } + auto text_color = param.resource.color; auto bar_color = param.resource.color.DARKEN(100); const auto TEXT_HEIGHT = loading_text_->getCharacterSize(); @@ -766,14 +773,16 @@ void Resource::renderProgress() { SDL_SetRenderDrawColor(renderer, bar_color.r, bar_color.g, bar_color.b, bar_color.a); SDL_RenderRect(renderer, &loading_wired_rect_); - // Escribe el texto de carga encima de la barra - /* - loading_text_->writeColored( - loading_wired_rect_.x, - loading_wired_rect_.y - 9, - Lang::getText("[RESOURCE] LOADING") + " : " + loading_resource_name_, - text_color); - */ + // Escribe el nombre del recurso que se está cargando, centrado sobre la barra + if (Options::loading.show_resource_name && !loading_resource_name_.empty()) { + loading_text_->writeDX( + Text::CENTER | Text::COLOR, + loading_wired_rect_.x + (loading_wired_rect_.w / 2), + loading_wired_rect_.y - TEXT_HEIGHT - 2, + loading_resource_name_, + 1, + text_color); + } // Muestra nombre de la aplicación loading_text_->writeDX( @@ -793,23 +802,6 @@ void Resource::renderProgress() { 1, text_color); - // Muestra información del monitor desplazada hacia abajo - /*loading_text_->writeColored( - X_PADDING, - Y_PADDING + 18, - screen->getDisplayMonitorName(), - text_color); - loading_text_->writeColored( - X_PADDING, - Y_PADDING + 27, - std::to_string(screen->getDisplayMonitorWidth()) + "x" + std::to_string(screen->getDisplayMonitorHeight()), - text_color); - loading_text_->writeColored( - X_PADDING, - Y_PADDING + 36, - std::to_string(screen->getDisplayMonitorRefreshRate()) + "Hz", - text_color);*/ - // Renderiza el frame en pantalla screen->coreRender(); } @@ -826,13 +818,14 @@ void Resource::loadDemoDataQuiet() { // Inicializa los rectangulos que definen la barra de progreso void Resource::initProgressBar() { - const float BAR_Y_POSITION = param.game.height - BAR_HEIGHT - Y_PADDING; + const float WIRED_BAR_WIDTH = param.game.width * BAR_WIDTH_RATIO; + const float BAR_X_POSITION = (param.game.width - WIRED_BAR_WIDTH) / 2.0F; + const float BAR_Y_POSITION = (param.game.height * BAR_Y_RATIO) - (BAR_HEIGHT / 2.0F); - const float WIRED_BAR_WIDTH = param.game.width - (X_PADDING * 2); - loading_wired_rect_ = {.x = X_PADDING, .y = BAR_Y_POSITION, .w = WIRED_BAR_WIDTH, .h = BAR_HEIGHT}; + loading_wired_rect_ = {.x = BAR_X_POSITION, .y = BAR_Y_POSITION, .w = WIRED_BAR_WIDTH, .h = BAR_HEIGHT}; const float FULL_BAR_WIDTH = WIRED_BAR_WIDTH * loading_count_.getPercentage(); - loading_full_rect_ = {.x = X_PADDING, .y = BAR_Y_POSITION, .w = FULL_BAR_WIDTH, .h = BAR_HEIGHT}; + loading_full_rect_ = {.x = BAR_X_POSITION, .y = BAR_Y_POSITION, .w = FULL_BAR_WIDTH, .h = BAR_HEIGHT}; } // Actualiza el progreso de carga y muestra la barra diff --git a/source/core/resources/resource.hpp b/source/core/resources/resource.hpp index 871a28a..eaab821 100644 --- a/source/core/resources/resource.hpp +++ b/source/core/resources/resource.hpp @@ -117,12 +117,15 @@ class Resource { } }; - // --- Constantes para la pantalla de carga --- - static constexpr float X_PADDING = 60.0F; - static constexpr float Y_PADDING = 20.0F; + // --- Constantes para la barra de progreso de la pantalla de carga --- + // BAR_WIDTH_RATIO: fracción del ancho de la pantalla ocupada por la barra (centrada) + // 1.0 = ancho completo, 0.5 = la mitad del ancho + // BAR_Y_RATIO: posición vertical del CENTRO de la barra en fracción de la altura + // 0.0 = centro en el borde superior, 1.0 = centro en el borde inferior + // BAR_HEIGHT: grosor de la barra en píxeles + static constexpr float BAR_WIDTH_RATIO = 0.5F; + static constexpr float BAR_Y_RATIO = 0.85F; static constexpr float BAR_HEIGHT = 5.0F; - static constexpr Color BAR_COLOR = Color(128, 128, 128); - static constexpr Color TEXT_COLOR = Color(255, 255, 255); // --- Modo de carga --- LoadingMode loading_mode_; diff --git a/source/core/system/defaults.hpp b/source/core/system/defaults.hpp index 51edf51..76619b6 100644 --- a/source/core/system/defaults.hpp +++ b/source/core/system/defaults.hpp @@ -213,3 +213,8 @@ namespace Defaults::Settings { constexpr bool SHUTDOWN_ENABLED = false; constexpr const char* PARAMS_FILE = "param_320x256.txt"; } // namespace Defaults::Settings + +namespace Defaults::Loading { + constexpr bool SHOW = false; + constexpr bool SHOW_RESOURCE_NAME = true; +} // namespace Defaults::Loading diff --git a/source/game/options.cpp b/source/game/options.cpp index 739adf5..3c539c5 100644 --- a/source/game/options.cpp +++ b/source/game/options.cpp @@ -21,6 +21,7 @@ namespace Options { Settings settings; // Opciones del juego Video video; // Opciones de vídeo Audio audio; // Opciones de audio + Loading loading; // Opciones de la pantalla de carga GamepadManager gamepad_manager; // Opciones de mando para cada jugador Keyboard keyboard; // Opciones para el teclado PendingChanges pending_changes; // Opciones que se aplican al cerrar @@ -489,6 +490,13 @@ namespace Options { } } + void loadLoadingFromYaml(const fkyaml::node& yaml) { + if (!yaml.contains("loading")) { return; } + const auto& ld = yaml["loading"]; + parseBoolField(ld, "show", loading.show); + parseBoolField(ld, "show_resource_name", loading.show_resource_name); + } + void loadGameFromYaml(const fkyaml::node& yaml) { if (!yaml.contains("game")) { return; } const auto& game = yaml["game"]; @@ -601,6 +609,7 @@ namespace Options { loadWindowFromYaml(yaml); loadVideoFromYaml(yaml); loadAudioFromYaml(yaml); + loadLoadingFromYaml(yaml); loadGameFromYaml(yaml); loadControllersFromYaml(yaml); loadKeyboardFromYaml(yaml); @@ -682,6 +691,13 @@ namespace Options { file << " volume: " << audio.sound.volume << "\n"; file << "\n"; + // LOADING + file << "# LOADING SCREEN\n"; + file << "loading:\n"; + file << " show: " << boolToString(loading.show) << "\n"; + file << " show_resource_name: " << boolToString(loading.show_resource_name) << "\n"; + file << "\n"; + // GAME file << "# GAME\n"; file << "game:\n"; diff --git a/source/game/options.hpp b/source/game/options.hpp index d383ef2..c53c1a1 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -109,6 +109,11 @@ namespace Options { int volume = Defaults::Audio::VOLUME; // Volumen general del audio }; + struct Loading { + bool show = Defaults::Loading::SHOW; // Muestra la pantalla de carga (si no, pantalla en negro) + bool show_resource_name = Defaults::Loading::SHOW_RESOURCE_NAME; // Muestra el nombre del recurso en curso sobre la barra de progreso + }; + struct Settings { static constexpr int CURRENT_CONFIG_VERSION = 3; // Versión esperada del fichero int config_version = CURRENT_CONFIG_VERSION; // Versión del archivo de configuración @@ -333,6 +338,7 @@ namespace Options { extern Settings settings; // Opciones del juego extern Video video; // Opciones de vídeo extern Audio audio; // Opciones de audio + extern Loading loading; // Opciones de la pantalla de carga extern GamepadManager gamepad_manager; // Manager de mandos para cada jugador extern Keyboard keyboard; // Opciones para el teclado extern PendingChanges pending_changes; // Opciones que se aplican al cerrar