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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user