afegit mode kiosko

This commit is contained in:
2026-03-11 19:14:22 +01:00
parent b79f1c3424
commit ce5c4681b8
4 changed files with 29 additions and 8 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -3,7 +3,8 @@
#include <SDL3/SDL_keycode.h> // for SDL_Keycode
#include <string> // 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)

View File

@@ -16,6 +16,7 @@ void printHelp() {
std::cout << " -z, --zoom <n> 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 <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();