Implementar Temas Dinámicos (Keyframe Sequence System)

 NUEVAS CARACTERÍSTICAS:

**Sistema de Temas Dinámicos Animados:**
- 3 temas dinámicos predefinidos con transiciones automáticas
- Keyframe sequence: múltiples estados intermedios con duraciones configurables
- Interpolación LERP entre keyframes (fondo + colores de pelotas)
- Loop infinito automático

**Temas Implementados:**
1. **SUNRISE (Numpad 8)** - Amanecer: Noche → Alba → Día
   - 4 keyframes: Azul nocturno → Naranja-rosa alba → Amarillo brillante día → Loop
   - Duraciones: 0s → 4s → 3s → 5s (total: 12s por ciclo)

2. **OCEAN WAVES (Numpad 9)** - Olas Oceánicas: Profundidad ↔ Superficie
   - 3 keyframes: Azul marino oscuro ↔ Turquesa brillante
   - Duraciones: 0s → 4s → 4s (total: 8s por ciclo)

3. **NEON PULSE (Numpad 0)** - Pulso Neón: Apagado ↔ Encendido
   - 3 keyframes: Negro apagado ↔ Cian-magenta vibrante
   - Duraciones: 0s → 1.5s → 1.5s (total: 3s ping-pong rápido)

**Controles:**
- Numpad 8/9/0: Activar tema dinámico SUNRISE/OCEAN WAVES/NEON PULSE
- Shift+D: Pausar/reanudar animación de tema dinámico activo
- Temas estáticos (1-7) desactivan modo dinámico automáticamente

**Arquitectura:**
- defines.h: Estructuras DynamicThemeKeyframe + DynamicTheme
- engine.h: Estado dinámico (keyframes, progress, pausa)
- engine.cpp:
  - initializeDynamicThemes(): 3 temas predefinidos con keyframes
  - updateDynamicTheme(): Motor de animación (avance keyframes + loop)
  - activateDynamicTheme(): Iniciar tema dinámico
  - pauseDynamicTheme(): Toggle pausa con Shift+D
  - renderGradientBackground(): Soporte interpolación keyframes
  - getInterpolatedColor(): Soporte colores dinámicos

**Detalles Técnicos:**
- Transiciones suaves independientes del framerate (delta_time)
- Compatibilidad total con sistema LERP estático existente
- Desactivación mutua: tema estático desactiva dinámico (y viceversa)
- Velocidades variables por transición (1.5s - 5s configurables)
- Display automático de nombre de tema al activar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-05 20:09:49 +02:00
parent 38b8789884
commit 9a6cfdaaeb
3 changed files with 346 additions and 40 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include <SDL3/SDL_stdinc.h> // for Uint64
#include <vector> // for std::vector in DynamicThemeKeyframe/DynamicTheme
// Configuración de ventana y pantalla
constexpr char WINDOW_CAPTION[] = "ViBe3 Physics (JailDesigner 2025)";
@@ -46,6 +47,29 @@ struct Color {
int r, g, b; // Componentes rojo, verde, azul (0-255)
};
// Estructura para keyframe de tema dinámico
struct DynamicThemeKeyframe {
// Fondo degradado
float bg_top_r, bg_top_g, bg_top_b;
float bg_bottom_r, bg_bottom_g, bg_bottom_b;
// Colores de pelotas en este keyframe
std::vector<Color> ball_colors;
// Duración de transición HACIA este keyframe (segundos)
// 0.0 = estado inicial (sin transición)
float duration;
};
// Estructura para tema dinámico (animado)
struct DynamicTheme {
const char* name_en; // Nombre en inglés
const char* name_es; // Nombre en español
int text_color_r, text_color_g, text_color_b; // Color del texto del tema
std::vector<DynamicThemeKeyframe> keyframes; // Mínimo 2 keyframes
bool loop; // ¿Volver al inicio al terminar?
};
// Enum para dirección de gravedad
enum class GravityDirection {
DOWN, // ↓ Gravedad hacia abajo (por defecto)
@@ -56,13 +80,16 @@ enum class GravityDirection {
// Enum para temas de colores (seleccionables con teclado numérico)
enum class ColorTheme {
SUNSET = 0, // Naranjas, rojos, amarillos, rosas
OCEAN = 1, // Azules, turquesas, blancos
NEON = 2, // Cian, magenta, verde lima, amarillo vibrante
FOREST = 3, // Verdes, marrones, amarillos otoño
RGB = 4, // RGB puros y subdivisiones matemáticas (fondo blanco)
MONOCHROME = 5, // Fondo negro degradado, sprites blancos monocromáticos
LAVENDER = 6 // Degradado violeta-azul, pelotas amarillo dorado
SUNSET = 0, // Naranjas, rojos, amarillos, rosas
OCEAN = 1, // Azules, turquesas, blancos
NEON = 2, // Cian, magenta, verde lima, amarillo vibrante
FOREST = 3, // Verdes, marrones, amarillos otoño
RGB = 4, // RGB puros y subdivisiones matemáticas (fondo blanco)
MONOCHROME = 5, // Fondo negro degradado, sprites blancos monocromáticos
LAVENDER = 6, // Degradado violeta-azul, pelotas amarillo dorado
DYNAMIC_1 = 7, // Tema dinámico 1: SUNRISE (amanecer)
DYNAMIC_2 = 8, // Tema dinámico 2: OCEAN WAVES (olas oceánicas)
DYNAMIC_3 = 9 // Tema dinámico 3: NEON PULSE (pulso neón)
};
// Enum para tipo de figura 3D