Commit Graph

14 Commits

Author SHA1 Message Date
95ab6dea46 Implementar tema MONOCHROME (6º tema visual) - Tecla KP_6
- Fondo negro degradado (similar a NEON)
- 8 tonos de gris: blanco puro a gris muy oscuro
- Estética minimalista monocromática
- Ciclo con tecla B incluye nuevo tema
- Actualizado README con documentación

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-04 06:58:39 +02:00
91f8bfdd30 Implementar zoom por profundidad Z con perspectiva 3D + toggle
NUEVAS CARACTERÍSTICAS:
- Zoom por profundidad Z: Escala sprites según distancia (0.5x-1.5x)
- Toggle con Numpad / (KP_DIVIDE) para activar/desactivar perspectiva
- Fix transición figura→física: Reset automático de depth_scale a 1.0
- Texto informativo: "DEPTH ZOOM ON/OFF"

IMPLEMENTACIÓN TÉCNICA:
- Ball class: Nueva variable depth_scale_ (0.5-1.5)
- Ball class: Getters/setters getDepthScale() / setDepthScale()
- Engine::addSpriteToBatch(): Parámetro scale con valor defecto 1.0
- Engine::addSpriteToBatch(): Cálculo de vértices escalados centrados
- Engine::updateShape(): Cálculo depth_scale = 0.5 + z_normalized * 1.0
- Engine::render(): Pasa depth_scale al batch en modo SHAPE
- Engine::toggleShapeMode(): Reset depth_scale en salida de figura
- Engine: Variable depth_zoom_enabled_ (true por defecto)
- Batch rendering: Mantiene performance (sin llamadas individuales)

EFECTO VISUAL:
- Pelotas lejanas (Z-): Pequeñas (50%) y oscuras
- Pelotas medias (Z=0): Normales (100%) y brillo medio
- Pelotas cercanas (Z+): Grandes (150%) y brillantes
- Perspectiva 3D realista combinada con Z-sorting

CONTROLES:
- Numpad /: Toggle zoom por profundidad (solo en modo SHAPE)
- Por defecto: ACTIVADO para máximo realismo 3D

README ACTUALIZADO:
- Añadida tecla KP_/ a tabla de controles
- Actualizada sección "Características Técnicas"
- Añadida línea "Zoom por profundidad" en características
- Actualizada sección "Uso" con control de perspectiva

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 21:00:19 +02:00
a484ce69e8 Implementar control manual de escala para figuras 3D + actualizar README
NUEVAS CARACTERÍSTICAS:
- Control de escala dinámico con Numpad +/-/* (30%-300%)
- Protección automática contra clipping según resolución
- Texto informativo muestra porcentaje de escala
- Fix: Redondeo correcto en display de escala (79% → 80%)

CAMBIOS EN README:
- Actualizar tabla de controles (C→F, T→B, añadir Q/W/E/R/T/Y/U/I)
- Documentar sistema polimórfico de figuras 3D
- Añadir sección "Controles de Figuras 3D" con Numpad +/-/*
- Actualizar debug display (8 líneas ahora)
- Expandir sección "Modo RotoBall" → "Sistema de Figuras 3D"
- Documentar Esfera y Cubo implementados
- Listar 6 figuras futuras (Wave/Helix/Torus/Cylinder/Icosahedron/Atom)
- Actualizar estructura del proyecto (añadir source/shapes/)
- Añadir parámetros de escala manual a sección técnica

IMPLEMENTACIÓN TÉCNICA:
- defines.h: Constantes SHAPE_SCALE_MIN/MAX/STEP/DEFAULT
- engine.h: Variable shape_scale_factor_, método clampShapeScale()
- engine.cpp: Handlers Numpad +/-/*, multiplicar scale_factor en updateShape()
- clampShapeScale(): Límite dinámico según tamaño de pantalla (90% máximo)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 20:41:29 +02:00
a7ec764ebc Implementar sistema polimórfico de figuras 3D (Sphere + Cube)
- Crear interfaz abstracta Shape con métodos virtuales
- Refactorizar RotoBall → SphereShape (clase polimórfica)
- Implementar CubeShape con triple rotación (X/Y/Z)
- Distribución inteligente en cubo: vértices/centros/grid 3D
- Cambiar controles: F=toggle, Q/W/E/R/T/Y/U/I=figuras, B=temas
- Actualizar SimulationMode: ROTOBALL → SHAPE
- Añadir enum ShapeType (8 figuras: Sphere/Cube/Helix/Torus/etc.)
- Incluir source/shapes/*.cpp en CMakeLists.txt
- Física compartida escalable entre todas las figuras
- Roadmap: 6 figuras pendientes (Helix/Torus/Wave/Cylinder/Icosahedron/Atom)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 20:20:10 +02:00
535c397be2 Mejorar interacción entre modos RotoBall y física con gestión de gravedad
Cambios principales:
- Fix: Pelotas ahora caen correctamente al salir de RotoBall (resetear on_surface_/stopped_)
- Fix: Al cambiar escenario en RotoBall, desactivar modo figura primero
- Feature: Al entrar en RotoBall, gravedad se desactiva automáticamente
- Feature: Tecla G desde RotoBall → Sale a física SIN gravedad (pelotas flotan)
- Feature: Tecla C desde RotoBall → Sale a física CON gravedad (pelotas caen)
- Feature: Cursores desde RotoBall → Sale a física CON gravedad + cambio dirección
- Feature: Cursores desde física sin gravedad → Reactiva gravedad automáticamente

Nuevos métodos:
- Ball::enableGravityIfDisabled() - Reactiva solo si está desactivada
- Ball::forceGravityOn() - Fuerza activación
- Ball::forceGravityOff() - Fuerza desactivación
- Engine::toggleRotoBallMode(bool force_gravity_on_exit) - Control de gravedad al salir

Lógica de controles desde RotoBall:
- C: Figura OFF → Física CON gravedad (caen)
- ↑↓←→: Figura OFF → Física CON gravedad + dirección (caen hacia dirección)
- G: Figura OFF → Física SIN gravedad (flotan)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 19:34:33 +02:00
22e3356f80 Implementar modo RotoBall - Esfera 3D rotante (demoscene effect)
Añadido modo alternativo de simulación que transforma las pelotas en una
esfera 3D rotante proyectada en 2D, inspirado en efectos clásicos de demoscene.

## Características Principales

- **Algoritmo Fibonacci Sphere**: Distribución uniforme de puntos en esfera 3D
- **Rotación dual**: Matrices de rotación en ejes X e Y simultáneos
- **Profundidad Z simulada**: Color modulation según distancia (oscuro=lejos, brillante=cerca)
- **Transición suave**: Interpolación de 1.5s desde física a esfera
- **Sin sprites adicionales**: Usa SDL_SetTextureColorMod para profundidad
- **Performance optimizado**: >60 FPS con 100,000 pelotas

## Implementación Técnica

### Nuevos Archivos/Cambios:
- `defines.h`: Enum SimulationMode + constantes RotoBall (radio, velocidades, brillo)
- `ball.h/cpp`: Soporte 3D (pos_3d, target_2d, depth_brightness, setters)
- `engine.h/cpp`: Lógica completa RotoBall (generate, update, toggle)
  - `generateRotoBallSphere()`: Fibonacci sphere algorithm
  - `updateRotoBall()`: Rotación 3D + proyección ortográfica
  - `toggleRotoBallMode()`: Cambio entre PHYSICS/ROTOBALL
- `README.md`: Documentación completa del modo
- `CLAUDE.md`: Detalles técnicos y algoritmos

## Parámetros Configurables (defines.h)

```cpp
ROTOBALL_RADIUS = 80.0f;           // Radio de la esfera
ROTOBALL_ROTATION_SPEED_Y = 1.5f;  // Velocidad rotación eje Y (rad/s)
ROTOBALL_ROTATION_SPEED_X = 0.8f;  // Velocidad rotación eje X (rad/s)
ROTOBALL_TRANSITION_TIME = 1.5f;   // Tiempo de transición (segundos)
ROTOBALL_MIN_BRIGHTNESS = 50;      // Brillo mínimo fondo (0-255)
ROTOBALL_MAX_BRIGHTNESS = 255;     // Brillo máximo frente (0-255)
```

## Uso

- **Tecla C**: Alternar entre modo física y modo RotoBall
- Compatible con todos los temas de colores
- Funciona con 1-100,000 pelotas
- Debug display muestra "MODE PHYSICS" o "MODE ROTOBALL"

## Performance

- Batch rendering: Una sola llamada SDL_RenderGeometry
- Fibonacci sphere recalculada por frame (O(n) predecible)
- Color mod CPU-side sin overhead GPU
- Delta time independiente del framerate

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 13:03:03 +02:00
79964732ef Implementar sistema de auto-reinicio con temporizador de inactividad
- Añadir getter isStopped() en Ball para detectar pelotas quietas
- Sistema de temporizador de 5 segundos que detecta cuando todas las pelotas están paradas
- Auto-reinicio aleatorio cuando se cumple el tiempo de inactividad:
  * Escenario aleatorio usando test_.size() (1 a 100,000 pelotas)
  * Tema aleatorio usando sizeof(themes_) (5 temas disponibles)
  * Reset inteligente del temporizador si alguna pelota se mueve
- Integración no intrusiva en update() del bucle principal
- Usa infraestructura existente (SDL_GetTicks, initBalls, rand)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-27 22:21:30 +02:00
7ac29f899b Implementar impulso direccional adaptativo para tecla ESPACIO
- Renombrar pushUpBalls() → pushBallsAwayFromGravity() con lógica direccional
- ESPACIO ahora impulsa en dirección opuesta a gravedad actual:
  * Gravedad DOWN → impulsa ARRIBA (comportamiento original)
  * Gravedad UP → impulsa ABAJO
  * Gravedad LEFT → impulsa DERECHA
  * Gravedad RIGHT → impulsa IZQUIERDA
- Corregir modVel() para aplicar impulso horizontal a todas las pelotas
- Actualizar documentación de controles en README.md

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-27 22:10:33 +02:00
4e030e4ef9 Implementar sistema flexible de temas con cantidad variable de colores
- Refactorizar ThemeColors para usar std::vector<Color> en lugar de array fijo
- Cada tema puede tener cualquier cantidad de colores (8, 12, 24, etc.)
- Expandir tema RGB a 24 colores del círculo cromático (cada 15°)
- Añadir función initializeThemes() para configuración dinámica
- Mantener temas originales con 8 colores cada uno
- Tema RGB ahora incluye transiciones suaves por todo el espectro

Paleta RGB matemáticamente perfecta:
- 6 colores primarios: R, Y, G, C, B, M (cada 60°)
- 18 colores intermedios: transiciones cada 15°
- Cobertura completa del círculo cromático 0°-345°

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 22:22:57 +02:00
ac57755bd2 Añadir tema RGB y actualizar documentación completa
- Añadido nuevo tema RGB con fondo blanco puro y colores matemáticos
- Actualizado README.md con controles actuales y nuevas características
- Reorganizada documentación de controles por categorías
- Corregida información obsoleta (resolución, temas, problemas)
- Añadido control KP_5 para selección directa del tema RGB
- Mejorada visibilidad del texto adaptando colores por tema

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 22:08:28 +02:00
7b24e387b7 Implementar modo real fullscreen y resolver conflictos
MODO REAL FULLSCREEN (F4):
- F4: Cambia resolución interna a resolución nativa del escritorio
- Pelotas usan dimensiones dinámicas del terreno de juego
- Interfaz se adapta automáticamente (texto, debug, gradiente)
- Reinicio automático de escena con nuevas dimensiones

RESOLUCIÓN DINÁMICA:
- Ball constructor acepta screen_width/height como parámetros
- Colisiones usan dimensiones dinámicas en lugar de constantes
- Spawn de pelotas usa margen configurable (BALL_SPAWN_MARGIN)
- Toda la interfaz se adapta a resolución actual

MODOS FULLSCREEN MUTUAMENTE EXCLUYENTES:
- F3 (fullscreen normal) y F4 (real fullscreen) se desactivan mutuamente
- F1/F2 (zoom) bloqueados durante cualquier modo fullscreen
- Sin estados mixtos que rompan el renderizado
- Transiciones seguras entre todos los modos

MEJORAS DE CONFIGURACIÓN:
- BALL_SPAWN_MARGIN: margen lateral configurable para spawn de pelotas
- Resolución base actualizada a 640x360 (16:9)
- Spawn margin reducido a 15% para mayor dispersión

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 19:20:02 +02:00
8a05f69442 Implementar sistema de zoom dinámico y fullscreen
- Agregar zoom dinámico de ventana con F1/F2
- F1: reducir zoom hasta 1x mínimo
- F2: aumentar zoom hasta máximo basado en resolución
- Centrado inteligente al cambiar zoom
- Cálculo correcto de zoom máximo usando SDL_GetCurrentDisplayMode()
- F3: toggle fullscreen entre ventana y pantalla completa
- Mover temas de colores de F1-F4 a teclado numérico (KP_1-4)
- Mejorar resolución base a 640x480 con zoom inicial 2x
- Resolver paths absolutos para data/ball.png

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 18:48:12 +02:00
19e1c414c2 Refactoring completo: migrar main.cpp a Engine class
 Características principales:
- Encapsulación completa de variables globales en Engine class
- main.cpp simplificado: 580+ líneas → 15 líneas
- Eliminados problemas de orden de declaración de funciones

🔧 Correcciones aplicadas:
- Colores degradado SUNSET restaurados al original
- Inicialización pelotas: velocidad lateral y posición corregidas
- Textos en MAYÚSCULAS con singular/plural correcto ("1 PELOTA"/"X PELOTAS")
- Uso correcto de changeGravityDirection() para reset de gravedad
- Funciones dbgtxt marcadas como inline para evitar múltiples definiciones

📁 Estructura final:
- engine.h/cpp: Clase Engine con toda la lógica encapsulada
- main.cpp: Interfaz mínima con Engine
- main_old.cpp: Eliminado (ya no necesario)
- CMakeLists.txt: Actualizado para excluir archivos obsoletos

🧪 Testing: Compilación exitosa, funcionalidad restaurada completamente

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 17:33:53 +02:00
cada46f732 Refactorización inicial: Crear estructura de clase Engine
PROGRESO INTERMEDIO - Estructura base de Engine implementada:

Nuevos archivos:
- engine.h: Declaración completa de clase Engine con encapsulación
- engine.cpp: Esqueleto de implementación con métodos stub
- main_new.cpp: Nuevo main simplificado (15 líneas vs 580)

Cambios en archivos existentes:
- defines.h: Añadir enum ColorTheme (centralizar definiciones)
- main.cpp: Eliminar enum ColorTheme duplicado

Arquitectura Engine:
- Encapsulación completa de variables globales (SDL, estado, timing, UI)
- Métodos organizados por responsabilidad (public/private)
- Eliminación de problemas de orden de declaración
- Base sólida para futuras extensiones

Estado: Compilación exitosa 
Pendiente: Migrar funcionalidad completa de métodos stub

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 17:09:42 +02:00