From 5e3c7eb7219e987649bb72ab939c6a659583ba69 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 26 Jun 2025 13:50:17 +0200 Subject: [PATCH] ServiceMenu: el aspecte es defineix en param.h --- data/config/param_320x240.txt | 9 +++- data/config/param_320x256.txt | 79 +++++++++++++++++++---------------- source/game.cpp | 2 +- source/param.cpp | 42 +++++++++++++++---- source/param.h | 19 ++++++++- source/ui/menu_renderer.cpp | 37 ++++------------ source/ui/menu_renderer.h | 8 +--- source/ui/service_menu.cpp | 3 +- source/ui/service_menu.h | 8 +--- source/utils.h | 5 --- 10 files changed, 117 insertions(+), 95 deletions(-) diff --git a/data/config/param_320x240.txt b/data/config/param_320x240.txt index f2a870b..06724c0 100644 --- a/data/config/param_320x240.txt +++ b/data/config/param_320x240.txt @@ -48,4 +48,11 @@ balloon_4.grav 0.10f notification.pos_v TOP notification.pos_h LEFT notification.sound false -notification.color 303030 \ No newline at end of file +notification.color 303030 + +## --- SERVICE MENU --- +service_menu.title_color 99FF62 +service_menu.text_color FFFFFF +service_menu.selected_color FFDC44 +service_menu.bg_color 000000F0 +service_menu.drop_shadow false \ No newline at end of file diff --git a/data/config/param_320x256.txt b/data/config/param_320x256.txt index 3a84a22..ad15ea4 100644 --- a/data/config/param_320x256.txt +++ b/data/config/param_320x256.txt @@ -1,51 +1,58 @@ -## GAME -game.item_size 20 # Tamaño de los items del juego -game.coffee_machine_w 28 # Ancho de la máquina de café -game.coffee_machine_h 37 # Alto de la máquina de café -game.width 320 # Ancho de la resolucion nativa del juego -game.height 256 # Alto de la resolucion nativa del juego -game.play_area.rect.x 0 # Rectangulo con la posición de la zona de juego -game.play_area.rect.y 0 # Rectangulo con la posición de la zona de juego -game.play_area.rect.w 320 # Rectangulo con la posición de la zona de juego -game.play_area.rect.h 216 # Rectangulo con la posición de la zona de juego -game.enter_name_seconds 60 # Duración en segundos para introducir el nombre al finalizar la partida +## --- GAME --- +game.item_size 20 # Tamaño de los items del juego +game.coffee_machine_w 28 # Ancho de la máquina de café +game.coffee_machine_h 37 # Alto de la máquina de café +game.width 320 # Ancho de la resolucion nativa del juego +game.height 256 # Alto de la resolucion nativa del juego +game.play_area.rect.x 0 # Rectangulo con la posición de la zona de juego +game.play_area.rect.y 0 # Rectangulo con la posición de la zona de juego +game.play_area.rect.w 320 # Rectangulo con la posición de la zona de juego +game.play_area.rect.h 216 # Rectangulo con la posición de la zona de juego +game.enter_name_seconds 60 # Duración en segundos para introducir el nombre al finalizar la partida -## FADE -fade.num_squares_width 160 -fade.num_squares_height 128 -fade.random_squares_delay 1 -fade.random_squares_mult 500 -fade.post_duration 80 -fade.venetian_size 12 +## --- FADE --- +fade.num_squares_width 160 +fade.num_squares_height 128 +fade.random_squares_delay 1 +fade.random_squares_mult 500 +fade.post_duration 80 +fade.venetian_size 12 -## SCOREBOARD -scoreboard.x 0 -scoreboard.y 216 -scoreboard.w 320 -scoreboard.h 40 +## --- SCOREBOARD --- +scoreboard.rect.x 0 +scoreboard.rect.y 216 +scoreboard.rect.w 320 +scoreboard.rect.h 40 -## TITLE +## --- TITLE --- title.press_start_position 180 title.title_duration 800 title.arcade_edition_position 123 title.title_c_c_position 80 -## BACKGROUND +## --- BACKGROUND --- background.attenuate_color FFFFFF background.attenuate_alpha 0 -## BALLOONS -balloon_1.vel 2.75f -balloon_1.grav 0.09f -balloon_2.vel 3.70f -balloon_2.grav 0.10f -balloon_3.vel 4.70f -balloon_3.grav 0.10f -balloon_4.vel 5.45f -balloon_4.grav 0.10f +## --- BALLOONS --- +balloon_1.vel 2.75f +balloon_1.grav 0.09f +balloon_2.vel 3.70f +balloon_2.grav 0.10f +balloon_3.vel 4.70f +balloon_3.grav 0.10f +balloon_4.vel 5.45f +balloon_4.grav 0.10f -## NOTIFICATION +## --- NOTIFICATION --- notification.pos_v TOP notification.pos_h LEFT notification.sound false -notification.color 303030 \ No newline at end of file +notification.color 303030 + +## --- SERVICE MENU --- +service_menu.title_color 99FF62 +service_menu.text_color FFFFFF +service_menu.selected_color FFDC44 +service_menu.bg_color 111100F0 +service_menu.drop_shadow false \ No newline at end of file diff --git a/source/game.cpp b/source/game.cpp index 7f09e2d..e99b7a8 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -1671,7 +1671,7 @@ void Game::setTotalPower() // Inicializa el marcador void Game::initScoreboard() { - scoreboard_->setPos({param.scoreboard.x, param.scoreboard.y, param.scoreboard.w, param.scoreboard.h}); + scoreboard_->setPos(param.scoreboard.rect); scoreboard_->setMode(SCOREBOARD_CENTER_PANEL, ScoreboardMode::STAGE_INFO); for (const auto &player : players_) { diff --git a/source/param.cpp b/source/param.cpp index 518cee9..4d38bb4 100644 --- a/source/param.cpp +++ b/source/param.cpp @@ -198,24 +198,24 @@ bool setParams(const std::string &var, const std::string &value) } // SCOREBOARD - else if (var == "scoreboard.x") + else if (var == "scoreboard.rect.x") { - param.scoreboard.x = std::stoi(value); + param.scoreboard.rect.x = std::stoi(value); } - else if (var == "scoreboard.y") + else if (var == "scoreboard.rect.y") { - param.scoreboard.y = std::stoi(value); + param.scoreboard.rect.y = std::stoi(value); } - else if (var == "scoreboard.w") + else if (var == "scoreboard.rect.w") { - param.scoreboard.w = std::stoi(value); + param.scoreboard.rect.w = std::stoi(value); } - else if (var == "scoreboard.h") + else if (var == "scoreboard.rect.h") { - param.scoreboard.h = std::stoi(value); + param.scoreboard.rect.h = std::stoi(value); } // TITLE @@ -323,6 +323,32 @@ bool setParams(const std::string &var, const std::string &value) param.notification.color = Color::fromHex(value); } + // SERVICE MENU + else if (var == "service_menu.title_color") + { + param.service_menu.title_color = Color::fromHex(value); + } + + else if (var == "service_menu.text_color") + { + param.service_menu.text_color = Color::fromHex(value); + } + + else if (var == "service_menu.selected_color") + { + param.service_menu.selected_color = Color::fromHex(value); + } + + else if (var == "service_menu.bg_color") + { + param.service_menu.bg_color = Color::fromHex(value); + } + + else if (var == "service_menu.drop_shadow") + { + param.service_menu.drop_shadow = stringToBool(value); + } + // RESTO else { diff --git a/source/param.h b/source/param.h index 71a5de4..783d209 100644 --- a/source/param.h +++ b/source/param.h @@ -67,16 +67,33 @@ struct ParamNotification Color color; // Color de las notificaciones }; +// --- Parámetros del marcador --- +struct ParamScoreboard +{ + SDL_FRect rect; // Posición y tamaño del marcador +}; + +// --- Parámetros del menú de servicio --- +struct ParamServiceMenu +{ + Color title_color; + Color text_color; + Color selected_color; + Color bg_color; + bool drop_shadow; +}; + // --- Estructura principal para almacenar todos los parámetros del juego --- struct Param { ParamGame game; // Parámetros del juego ParamFade fade; // Parámetros del fade - SDL_FRect scoreboard; // Rectángulo del marcador + ParamScoreboard scoreboard; // Rectángulo del marcador ParamTitle title; // Parámetros de la pantalla de título ParamBackground background; // Parámetros del fondo std::vector balloon; // Parámetros de los globos ParamNotification notification; // Parámetros de las notificaciones + ParamServiceMenu service_menu; // Parámetros del menú de servicio // Constructor Param() : game(), fade(), scoreboard(), title(), background(), notification() diff --git a/source/ui/menu_renderer.cpp b/source/ui/menu_renderer.cpp index 8b9ca64..77f181a 100644 --- a/source/ui/menu_renderer.cpp +++ b/source/ui/menu_renderer.cpp @@ -3,34 +3,15 @@ #include "menu_option.h" // Necesario para acceder a las opciones #include "screen.h" // Para param #include +#include "param.h" MenuRenderer::MenuRenderer(const ServiceMenu *menu_state, std::shared_ptr element_text, std::shared_ptr title_text) - : element_text_(std::move(element_text)), title_text_(std::move(title_text)) { init(menu_state); } - -void MenuRenderer::init(const ServiceMenu *menu_state) -{ - aspect_ = menu_state->getAspect(); - switch (aspect_) - { - case ServiceMenu::Aspect::SHADOW: - bg_color_ = SERV_MENU_BG_COLOR_SHADOW; - bg_alpha_ = 255; - break; - - case ServiceMenu::Aspect::ALPHA: - bg_color_ = SERV_MENU_BG_COLOR_ALPHA; - bg_alpha_ = 240; - break; - - default: - break; - } -} + : element_text_(std::move(element_text)), title_text_(std::move(title_text)) {} void MenuRenderer::render(const ServiceMenu *menu_state) { // Dibuja la sombra - if (aspect_ == ServiceMenu::Aspect::SHADOW) + if (param.service_menu.drop_shadow) { SDL_FRect shadowRect = {rect_.x + 5, rect_.y + 5, rect_.w, rect_.h}; SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 64); @@ -38,18 +19,18 @@ void MenuRenderer::render(const ServiceMenu *menu_state) } // Dibuja el fondo - SDL_SetRenderDrawColor(Screen::get()->getRenderer(), bg_color_.r, bg_color_.g, bg_color_.b, bg_alpha_); + SDL_SetRenderDrawColor(Screen::get()->getRenderer(), param.service_menu.bg_color.r, param.service_menu.bg_color.g, param.service_menu.bg_color.b, param.service_menu.bg_color.a); SDL_RenderFillRect(Screen::get()->getRenderer(), &rect_); // Dibuja el borde - const Color BORDER_COLOR = title_color_.darken(); + const Color BORDER_COLOR = param.service_menu.title_color.darken(); SDL_SetRenderDrawColor(Screen::get()->getRenderer(), BORDER_COLOR.r, BORDER_COLOR.g, BORDER_COLOR.b, 255); SDL_RenderRect(Screen::get()->getRenderer(), &rect_); SDL_RenderRect(Screen::get()->getRenderer(), &border_rect_); // Dibuja el título float y = rect_.y + title_padding_; - title_text_->writeDX(TEXT_COLOR | TEXT_CENTER, param.game.game_area.center_x, y, menu_state->getTitle(), -4, title_color_); + title_text_->writeDX(TEXT_COLOR | TEXT_CENTER, param.game.game_area.center_x, y, menu_state->getTitle(), -4, param.service_menu.title_color); // Dibuja la línea separadora y = rect_.y + upper_height_; @@ -62,7 +43,7 @@ void MenuRenderer::render(const ServiceMenu *menu_state) for (size_t i = 0; i < option_pairs.size(); ++i) { const bool is_selected = (i == menu_state->getSelectedIndex()); - const Color ¤t_color = is_selected ? selected_color_ : text_color_; + const Color ¤t_color = is_selected ? param.service_menu.selected_color : param.service_menu.text_color; if (menu_state->getCurrentGroupAlignment() == ServiceMenu::GroupAlignment::LEFT) { @@ -85,7 +66,7 @@ void MenuRenderer::update(const ServiceMenu *menu_state) updateResizeAnimation(); } updateColorCounter(); - selected_color_ = getAnimatedSelectedColor(); + param.service_menu.selected_color = getAnimatedSelectedColor(); } void MenuRenderer::onLayoutChanged(const ServiceMenu *menu_state) @@ -231,7 +212,7 @@ void MenuRenderer::updateColorCounter() Color MenuRenderer::getAnimatedSelectedColor() { - static auto colorCycle = generateMirroredCycle(SERV_MENU_SELECTED_COLOR, ColorCycleStyle::HueWave); + static auto colorCycle = generateMirroredCycle(param.service_menu.selected_color, ColorCycleStyle::HueWave); return colorCycle.at(color_counter_ % colorCycle.size()); } diff --git a/source/ui/menu_renderer.h b/source/ui/menu_renderer.h index bc92118..445edc6 100644 --- a/source/ui/menu_renderer.h +++ b/source/ui/menu_renderer.h @@ -7,6 +7,7 @@ #include "ui/service_menu.h" // Necesario para las enums y para acceder al estado del menú #include "utils.h" // Para Color + // Forward declarations class Text; class MenuOption; @@ -33,14 +34,8 @@ private: std::shared_ptr title_text_; // --- Variables de estado de la vista (layout y animación) --- - ServiceMenu::Aspect aspect_ = ServiceMenu::Aspect::ALPHA; SDL_FRect rect_{}; SDL_FRect border_rect_{}; - Color bg_color_ = SERV_MENU_BG_COLOR_ALPHA; - Uint8 bg_alpha_ = 240; - Color title_color_ = SERV_MENU_TITLE_COLOR; - Color text_color_ = SERV_MENU_TEXT_COLOR; - Color selected_color_ = SERV_MENU_SELECTED_COLOR; size_t width_ = 0; size_t height_ = 0; size_t options_height_ = 0; @@ -64,7 +59,6 @@ private: int group_menu_widths_[5]{}; // --- Métodos privados de la vista --- - void init(const ServiceMenu *menu_state); void setAnchors(const ServiceMenu *menu_state); SDL_FRect calculateNewRect(const ServiceMenu *menu_state); void resize(const ServiceMenu *menu_state); diff --git a/source/ui/service_menu.cpp b/source/ui/service_menu.cpp index 21002c2..60fe06c 100644 --- a/source/ui/service_menu.cpp +++ b/source/ui/service_menu.cpp @@ -6,6 +6,7 @@ #include "section.h" #include "screen.h" #include "asset.h" +#include "param.h" // Singleton ServiceMenu *ServiceMenu::instance_ = nullptr; @@ -22,7 +23,7 @@ ServiceMenu::ServiceMenu() auto title_text = Resource::get()->getText("04b_25_flat_2x"); renderer_ = std::make_unique(this, element_text, title_text); - restart_message_ui_ = std::make_unique(element_text, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), SERV_MENU_TITLE_COLOR); + restart_message_ui_ = std::make_unique(element_text, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), param.service_menu.title_color); reset(); } diff --git a/source/ui/service_menu.h b/source/ui/service_menu.h index 85fe388..ae198ee 100644 --- a/source/ui/service_menu.h +++ b/source/ui/service_menu.h @@ -15,11 +15,6 @@ class MenuRenderer; // <-- Nuevo class ServiceMenu { public: - enum class Aspect - { - SHADOW, - ALPHA - }; enum class SettingsGroup { VIDEO, @@ -28,6 +23,7 @@ public: SYSTEM, MAIN }; + enum class GroupAlignment { CENTERED, @@ -65,7 +61,6 @@ public: size_t getSelectedIndex() const { return selected_; } const std::vector> &getOptionPairs() const { return option_pairs_; } size_t countOptionsInGroup(SettingsGroup group) const; - Aspect getAspect() const { return aspect_; } private: // --- Lógica de estado del menú (Modelo) --- @@ -76,7 +71,6 @@ private: SettingsGroup current_settings_group_; SettingsGroup previous_settings_group_; - Aspect aspect_ = Aspect::ALPHA; std::string title_; size_t selected_ = 0; size_t main_menu_selected_ = 0; diff --git a/source/utils.h b/source/utils.h index 506082a..dd35637 100644 --- a/source/utils.h +++ b/source/utils.h @@ -187,11 +187,6 @@ constexpr Color GREEN_COLOR = Color(0X5B, 0XEC, 0X95); constexpr Color BLUE_SKY_COLOR = Color(0X02, 0X88, 0XD1); constexpr Color PINK_SKY_COLOR = Color(0XFF, 0X6B, 0X97); constexpr Color GREEN_SKY_COLOR = Color(0X00, 0X79, 0X6B); -constexpr Color SERV_MENU_TITLE_COLOR = Color(0x99, 0xFF, 0x62); -constexpr Color SERV_MENU_TEXT_COLOR = Color(255, 255, 255); -constexpr Color SERV_MENU_SELECTED_COLOR = Color(255, 170, 18).lighten(); -constexpr Color SERV_MENU_BG_COLOR_SHADOW = Color(0x1E, 0x1E, 0x1E); -constexpr Color SERV_MENU_BG_COLOR_ALPHA = Color(0x00, 0x00, 0x00); constexpr Color DEBUG_COLOR = Color(0xFF, 0xFF, 0x00); // Colores y gráficos