diff --git a/source/defines.hpp b/source/defines.hpp index 6336f18..48755f2 100644 --- a/source/defines.hpp +++ b/source/defines.hpp @@ -32,6 +32,7 @@ constexpr Uint64 NOTIFICATION_FADE_TIME = 200; // Duración animación salida constexpr float NOTIFICATION_BG_ALPHA = 0.7f; // Opacidad fondo semitransparente (0.0-1.0) constexpr int NOTIFICATION_PADDING = 10; // Padding interno del fondo (píxeles físicos) constexpr int NOTIFICATION_TOP_MARGIN = 20; // Margen superior desde borde pantalla (píxeles físicos) +constexpr char KIOSK_NOTIFICATION_TEXT[] = "MODO KIOSKO"; // Configuración de pérdida aleatoria en rebotes constexpr float BASE_BOUNCE_COEFFICIENT = 0.75f; // Coeficiente base IGUAL para todas las pelotas diff --git a/source/engine.hpp b/source/engine.hpp index 9c9ea95..80c10fb 100644 --- a/source/engine.hpp +++ b/source/engine.hpp @@ -71,6 +71,13 @@ class Engine { void toggleRealFullscreen(); void toggleIntegerScaling(); + // Modo kiosko + void setKioskMode(bool enabled) { kiosk_mode_ = enabled; } + bool isKioskMode() const { return kiosk_mode_; } + + // Notificaciones (público para InputHandler) + void showNotificationForAction(const std::string& text); + // Modos de aplicación (DEMO/LOGO) void toggleDemoMode(); void toggleDemoLiteMode(); @@ -131,6 +138,7 @@ class Engine { bool vsync_enabled_ = true; bool fullscreen_enabled_ = false; bool real_fullscreen_enabled_ = false; + bool kiosk_mode_ = false; ScalingMode current_scaling_mode_ = ScalingMode::INTEGER; // Modo de escalado actual (F5) // Resolución base (configurada por CLI o default) @@ -204,7 +212,6 @@ class Engine { void render(); // Métodos auxiliares privados (llamados por la interfaz pública) - void showNotificationForAction(const std::string& text); // Mostrar notificación solo en modo MANUAL // Sistema de cambio de sprites dinámico - Métodos privados void switchTextureInternal(bool show_notification); // Implementación interna del cambio de textura diff --git a/source/input/input_handler.cpp b/source/input/input_handler.cpp index a644719..a6c1b99 100644 --- a/source/input/input_handler.cpp +++ b/source/input/input_handler.cpp @@ -3,7 +3,8 @@ #include // for SDL_Keycode #include // for std::string, std::to_string -#include "engine.hpp" // for Engine +#include "defines.hpp" // for KIOSK_NOTIFICATION_TEXT +#include "engine.hpp" // for Engine #include "external/mouse.hpp" // for Mouse namespace bool InputHandler::processEvents(Engine& engine) { @@ -21,6 +22,10 @@ bool InputHandler::processEvents(Engine& engine) { if (event.type == SDL_EVENT_KEY_DOWN && event.key.repeat == 0) { switch (event.key.key) { case SDLK_ESCAPE: + if (engine.isKioskMode()) { + engine.showNotificationForAction(KIOSK_NOTIFICATION_TEXT); + break; + } return true; // Solicitar salida case SDLK_SPACE: @@ -221,21 +226,21 @@ bool InputHandler::processEvents(Engine& engine) { // Controles de zoom dinámico (solo si no estamos en fullscreen) case SDLK_F1: - engine.handleZoomOut(); + if (!engine.isKioskMode()) engine.handleZoomOut(); break; case SDLK_F2: - engine.handleZoomIn(); + if (!engine.isKioskMode()) engine.handleZoomIn(); break; // Control de pantalla completa case SDLK_F3: - engine.toggleFullscreen(); + if (!engine.isKioskMode()) engine.toggleFullscreen(); break; // Modo real fullscreen (cambia resolución interna) case SDLK_F4: - engine.toggleRealFullscreen(); + if (!engine.isKioskMode()) engine.toggleRealFullscreen(); break; // Toggle escalado entero/estirado (solo en fullscreen F3) diff --git a/source/main.cpp b/source/main.cpp index 22f0d39..87f27b7 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -16,6 +16,7 @@ void printHelp() { std::cout << " -z, --zoom Zoom de ventana (default: 3)\n"; std::cout << " -f, --fullscreen Modo pantalla completa (F3 - letterbox)\n"; std::cout << " -F, --real-fullscreen Modo pantalla completa real (F4 - nativo)\n"; + std::cout << " -k, --kiosk Modo kiosko (F4 fijo, sin ESC, sin zoom)\n"; std::cout << " -m, --mode Modo inicial: sandbox, demo, demo-lite, logo (default: sandbox)\n"; std::cout << " --help Mostrar esta ayuda\n\n"; std::cout << "Ejemplos:\n"; @@ -24,6 +25,7 @@ void printHelp() { std::cout << " vibe3_physics -w 640 -h 480 -z 2 # 640x480 zoom 2 (ventana 1280x960)\n"; std::cout << " vibe3_physics -f # Fullscreen letterbox (F3)\n"; std::cout << " vibe3_physics -F # Fullscreen real (F4 - resolución nativa)\n"; + std::cout << " vibe3_physics -k # Modo kiosko (pantalla completa real, bloqueado)\n"; std::cout << " vibe3_physics --mode demo # Arrancar en modo DEMO (auto-play)\n"; std::cout << " vibe3_physics -m demo-lite # Arrancar en modo DEMO_LITE (solo física)\n"; std::cout << " vibe3_physics -F --mode logo # Fullscreen + modo LOGO (easter egg)\n\n"; @@ -36,6 +38,7 @@ int main(int argc, char* argv[]) { int zoom = 0; bool fullscreen = false; bool real_fullscreen = false; + bool kiosk_mode = false; AppMode initial_mode = AppMode::SANDBOX; // Modo inicial (default: SANDBOX) // Parsear argumentos @@ -80,6 +83,8 @@ int main(int argc, char* argv[]) { fullscreen = true; } else if (strcmp(argv[i], "-F") == 0 || strcmp(argv[i], "--real-fullscreen") == 0) { real_fullscreen = true; + } else if (strcmp(argv[i], "-k") == 0 || strcmp(argv[i], "--kiosk") == 0) { + kiosk_mode = true; } else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--mode") == 0) { if (i + 1 < argc) { std::string mode_str = argv[++i]; @@ -118,10 +123,13 @@ int main(int argc, char* argv[]) { return -1; } - // Si se especificó real fullscreen (F4), activar después de inicializar - if (real_fullscreen) { + // Si se especificó real fullscreen (F4) o modo kiosko, activar después de inicializar + if (real_fullscreen || kiosk_mode) { engine.toggleRealFullscreen(); } + if (kiosk_mode) { + engine.setKioskMode(true); + } engine.run(); engine.shutdown();