Add: Sistema de páginas para selección de temas + 5 nuevos temas
Implementación: - 5 nuevos temas (2 estáticos: CRIMSON, EMERALD / 3 dinámicos: FIRE, AURORA, VOLCANIC) - Sistema de páginas con Numpad Enter (Página 1 ↔ Página 2) - Shift+B para ciclar temas hacia atrás - Página 1: 9 temas estáticos + SUNRISE (Numpad 1-9, 0) - Página 2: 5 temas dinámicos animados (Numpad 1-5) Motivo: - Shift+Numpad no funciona en Windows (limitación hardware/OS) - Solución: Toggle de página con Numpad Enter Archivos modificados: - defines.h: Añadidos 5 nuevos ColorTheme enum values - theme_manager.h: Añadido cyclePrevTheme() + actualizada doc 10→15 temas - theme_manager.cpp: Implementados 5 nuevos temas + cyclePrevTheme() - engine.h: Añadida variable theme_page_ (0 o 1) - engine.cpp: Handlers Numpad Enter, KP_1-9,0 con sistema de páginas, SDLK_B con Shift detection - CLAUDE.md: Documentación actualizada con tablas de 2 páginas 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -421,114 +421,171 @@ void Engine::handleEvents() {
|
||||
|
||||
// Ciclar temas de color (movido de T a B)
|
||||
case SDLK_B:
|
||||
// Ciclar al siguiente tema con transición suave
|
||||
theme_manager_->cycleTheme();
|
||||
{
|
||||
// Detectar si Shift está presionado
|
||||
SDL_Keymod modstate = SDL_GetModState();
|
||||
if (modstate & SDL_KMOD_SHIFT) {
|
||||
// Shift+B: Ciclar hacia atrás (tema anterior)
|
||||
theme_manager_->cyclePrevTheme();
|
||||
} else {
|
||||
// B solo: Ciclar hacia adelante (tema siguiente)
|
||||
theme_manager_->cycleTheme();
|
||||
}
|
||||
|
||||
// Mostrar nombre del tema (solo si NO estamos en modo demo)
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Mostrar nombre del tema (solo si NO estamos en modo demo)
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Temas de colores con teclado numérico (con transición suave)
|
||||
case SDLK_KP_1:
|
||||
theme_manager_->switchToTheme(0); // SUNSET
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Página 0: SUNSET (0), Página 1: OCEAN_WAVES (10)
|
||||
{
|
||||
int theme_index = (theme_page_ == 0) ? 0 : 10;
|
||||
theme_manager_->switchToTheme(theme_index);
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_2:
|
||||
theme_manager_->switchToTheme(1); // OCEAN
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Página 0: OCEAN (1), Página 1: NEON_PULSE (11)
|
||||
{
|
||||
int theme_index = (theme_page_ == 0) ? 1 : 11;
|
||||
theme_manager_->switchToTheme(theme_index);
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_3:
|
||||
theme_manager_->switchToTheme(2); // NEON
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Página 0: NEON (2), Página 1: FIRE (12)
|
||||
{
|
||||
int theme_index = (theme_page_ == 0) ? 2 : 12;
|
||||
theme_manager_->switchToTheme(theme_index);
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_4:
|
||||
theme_manager_->switchToTheme(3); // FOREST
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Página 0: FOREST (3), Página 1: AURORA (13)
|
||||
{
|
||||
int theme_index = (theme_page_ == 0) ? 3 : 13;
|
||||
theme_manager_->switchToTheme(theme_index);
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_5:
|
||||
theme_manager_->switchToTheme(4); // RGB
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Página 0: RGB (4), Página 1: VOLCANIC (14)
|
||||
{
|
||||
int theme_index = (theme_page_ == 0) ? 4 : 14;
|
||||
theme_manager_->switchToTheme(theme_index);
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_6:
|
||||
theme_manager_->switchToTheme(5); // MONOCHROME
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Solo página 0: MONOCHROME (5)
|
||||
if (theme_page_ == 0) {
|
||||
theme_manager_->switchToTheme(5); // MONOCHROME
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_7:
|
||||
theme_manager_->switchToTheme(6); // LAVENDER
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Solo página 0: LAVENDER (6)
|
||||
if (theme_page_ == 0) {
|
||||
theme_manager_->switchToTheme(6); // LAVENDER
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Temas dinámicos (animados) - Solo Numpad 8/9/0 (teclas normales usadas para escenarios)
|
||||
case SDLK_KP_8:
|
||||
theme_manager_->switchToTheme(7); // SUNRISE
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Solo página 0: CRIMSON (7)
|
||||
if (theme_page_ == 0) {
|
||||
theme_manager_->switchToTheme(7); // CRIMSON
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_9:
|
||||
theme_manager_->switchToTheme(8); // OCEAN WAVES
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
// Solo página 0: EMERALD (8)
|
||||
if (theme_page_ == 0) {
|
||||
theme_manager_->switchToTheme(8); // EMERALD
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_KP_0:
|
||||
theme_manager_->switchToTheme(9); // NEON PULSE
|
||||
// Solo página 0: SUNRISE (9)
|
||||
if (theme_page_ == 0) {
|
||||
theme_manager_->switchToTheme(9); // SUNRISE
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Toggle de página de temas (Numpad Enter)
|
||||
case SDLK_KP_ENTER:
|
||||
// Alternar entre página 0 y página 1
|
||||
theme_page_ = (theme_page_ == 0) ? 1 : 0;
|
||||
|
||||
// Mostrar feedback visual (solo si NO estamos en modo demo)
|
||||
if (current_app_mode_ == AppMode::MANUAL) {
|
||||
text_ = theme_manager_->getCurrentThemeNameES();
|
||||
text_ = (theme_page_ == 0) ? "PAGINA 1" : "PAGINA 2";
|
||||
text_pos_ = (current_screen_width_ - static_cast<int>(text_.length() * 8)) / 2;
|
||||
show_text_ = true;
|
||||
text_init_time_ = SDL_GetTicks();
|
||||
@@ -1627,8 +1684,8 @@ void Engine::performDemoAction(bool is_lite) {
|
||||
// Cambiar tema (15%)
|
||||
accumulated_weight += DEMO_WEIGHT_THEME;
|
||||
if (random_value < accumulated_weight) {
|
||||
// Elegir entre TODOS los 10 temas (estáticos + dinámicos)
|
||||
int random_theme_index = rand() % 10;
|
||||
// Elegir entre TODOS los 15 temas (9 estáticos + 6 dinámicos)
|
||||
int random_theme_index = rand() % 15;
|
||||
theme_manager_->switchToTheme(random_theme_index);
|
||||
return;
|
||||
}
|
||||
@@ -1717,8 +1774,8 @@ void Engine::randomizeOnDemoStart(bool is_lite) {
|
||||
scenario_ = valid_scenarios[rand() % 5];
|
||||
initBalls(scenario_);
|
||||
|
||||
// 2. Tema (elegir entre TODOS los 10 temas)
|
||||
int random_theme_index = rand() % 10;
|
||||
// 2. Tema (elegir entre TODOS los 15 temas)
|
||||
int random_theme_index = rand() % 15;
|
||||
theme_manager_->switchToTheme(random_theme_index);
|
||||
|
||||
// 3. Sprite
|
||||
|
||||
Reference in New Issue
Block a user