ServiceMenu: el aspecte es defineix en param.h

This commit is contained in:
2025-06-26 13:50:17 +02:00
parent 231bd05f5e
commit 5e3c7eb721
10 changed files with 117 additions and 95 deletions

View File

@@ -48,4 +48,11 @@ balloon_4.grav 0.10f
notification.pos_v TOP
notification.pos_h LEFT
notification.sound false
notification.color 303030
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

View File

@@ -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
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

View File

@@ -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_)
{

View File

@@ -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
{

View File

@@ -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<ParamBalloon> 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()

View File

@@ -3,34 +3,15 @@
#include "menu_option.h" // Necesario para acceder a las opciones
#include "screen.h" // Para param
#include <array>
#include "param.h"
MenuRenderer::MenuRenderer(const ServiceMenu *menu_state, std::shared_ptr<Text> element_text, std::shared_ptr<Text> 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 &current_color = is_selected ? selected_color_ : text_color_;
const Color &current_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());
}

View File

@@ -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<Text> 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);

View File

@@ -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<MenuRenderer>(this, element_text, title_text);
restart_message_ui_ = std::make_unique<UIMessage>(element_text, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), SERV_MENU_TITLE_COLOR);
restart_message_ui_ = std::make_unique<UIMessage>(element_text, Lang::getText("[SERVICE_MENU] NEED_RESTART_MESSAGE"), param.service_menu.title_color);
reset();
}

View File

@@ -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<std::pair<std::string, std::string>> &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;

View File

@@ -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