feat: Argumentos CLI para establecer AppMode inicial

Permite arrancar directamente en modo DEMO, DEMO_LITE, LOGO o SANDBOX
mediante argumentos de línea de comandos, eliminando necesidad de
cambiar manualmente el modo después del arranque.

Nuevos argumentos:
- `-m, --mode <mode>` - Establece modo inicial
  - `sandbox` - Control manual (default)
  - `demo` - Auto-play completo (figuras + temas + colisiones)
  - `demo-lite` - Auto-play simple (solo física/figuras)
  - `logo` - Modo logo (easter egg con convergencia)

Ejemplos de uso:
```bash
# Arrancar en modo DEMO
./vibe3_physics --mode demo
./vibe3_physics -m demo

# Arrancar en DEMO_LITE (solo física)
./vibe3_physics -m demo-lite

# Arrancar directo en LOGO
./vibe3_physics --mode logo

# Combinar con otros argumentos
./vibe3_physics -w 1920 -h 1080 --mode demo
./vibe3_physics -F -m demo-lite  # Fullscreen + DEMO_LITE
```

Implementación:
1. main.cpp: Parsing de argumento --mode con validación
2. engine.h: Nuevo parámetro `initial_mode` en initialize()
3. engine.cpp: Aplicación del modo vía StateManager::setState()

Si no se especifica --mode, se usa SANDBOX (comportamiento actual).
El modo se aplica después de inicializar StateManager, garantizando
que todos los componentes estén listos antes del cambio de estado.

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-18 19:00:16 +02:00
parent 7609b9ef5c
commit c3d24cc07d
4 changed files with 38 additions and 7 deletions

View File

@@ -37,7 +37,7 @@
// getExecutableDirectory() ya está definido en defines.h como inline
// Implementación de métodos públicos
bool Engine::initialize(int width, int height, int zoom, bool fullscreen) {
bool Engine::initialize(int width, int height, int zoom, bool fullscreen, AppMode initial_mode) {
bool success = true;
// Obtener resolución de pantalla para validación
@@ -246,6 +246,11 @@ bool Engine::initialize(int width, int height, int zoom, bool fullscreen) {
state_manager_ = std::make_unique<StateManager>();
state_manager_->initialize(this); // Callback al Engine
// Establecer modo inicial si no es SANDBOX (default)
if (initial_mode != AppMode::SANDBOX) {
state_manager_->setState(initial_mode, current_screen_width_, current_screen_height_);
}
// Actualizar ShapeManager con StateManager (dependencia circular - StateManager debe existir primero)
shape_manager_->initialize(this, scene_manager_.get(), ui_manager_.get(), state_manager_.get(),
current_screen_width_, current_screen_height_);