From aa57ac7012181b33343f11fca42bfbd3b61c8186 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 10 Oct 2025 09:20:24 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Sistema=20de=20zoom=20y=20fullscreen=20c?= =?UTF-8?q?on=20par=C3=A1metros=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige bugs críticos en el manejo de ventanas cuando se inician con parámetros de línea de comandos (-w, -h, -z). ## Problemas Resueltos **1. Zoom incorrecto con parámetros CLI** - El zoom calculado no se guardaba en current_window_zoom_ - F1/F2 usaban valor default (3) en lugar del zoom actual - Resultado: Posicionamiento erróneo de ventana al hacer zoom **2. Ventana no centrada al iniciar** - Faltaba SDL_SetWindowPosition() después de crear ventana - Ventana aparecía en posición aleatoria **3. F4 restauraba tamaño incorrecto** - toggleRealFullscreen() usaba DEFAULT_WINDOW_ZOOM hardcoded - Al salir de fullscreen real, ventana cambiaba de tamaño - No re-centraba ventana después de restaurar ## Cambios Implementados **engine.cpp:initialize() línea 86-87:** - Guardar zoom calculado en current_window_zoom_ antes de crear ventana - Asegura consistencia entre zoom real y zoom guardado **engine.cpp:initialize() línea 114-117:** - Centrar ventana con SDL_WINDOWPOS_CENTERED al iniciar - Solo si no está en modo fullscreen **engine.cpp:toggleRealFullscreen() línea 1174-1175:** - Usar current_window_zoom_ en lugar de DEFAULT_WINDOW_ZOOM - Re-centrar ventana con SDL_WINDOWPOS_CENTERED al salir de F4 ## Casos de Prueba Verificados ✅ Sin parámetros: vibe3_physics.exe ✅ Con resolución: vibe3_physics.exe -w 640 -h 480 ✅ Con zoom: vibe3_physics.exe -z 2 ✅ Combinado: vibe3_physics.exe -w 1920 -h 1080 -z 1 ## Teclas Afectadas - F1 (Zoom Out): ✅ Funciona correctamente - F2 (Zoom In): ✅ Funciona correctamente - F3 (Fullscreen Toggle): ✅ Funciona correctamente - F4 (Real Fullscreen): ✅ Ahora restaura tamaño correcto 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- source/engine.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/engine.cpp b/source/engine.cpp index 8131645..d62a778 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -83,6 +83,9 @@ bool Engine::initialize(int width, int height, int zoom, bool fullscreen) { window_zoom = 1; } + // Guardar zoom calculado ANTES de crear la ventana (para F1/F2/F3/F4) + current_window_zoom_ = window_zoom; + // Calcular tamaño de ventana int window_width = logical_width * window_zoom; int window_height = logical_height * window_zoom; @@ -108,6 +111,11 @@ bool Engine::initialize(int width, int height, int zoom, bool fullscreen) { std::cout << "¡No se pudo crear la ventana! Error de SDL: " << SDL_GetError() << std::endl; success = false; } else { + // Centrar ventana en pantalla si no está en fullscreen + if (!fullscreen) { + SDL_SetWindowPosition(window_, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + } + // Crear renderizador renderer_ = SDL_CreateRenderer(window_, nullptr); if (renderer_ == nullptr) { @@ -1161,9 +1169,10 @@ void Engine::toggleRealFullscreen() { current_screen_width_ = base_screen_width_; current_screen_height_ = base_screen_height_; - // Restaurar ventana normal + // Restaurar ventana normal con el zoom actual (no hardcoded) SDL_SetWindowFullscreen(window_, false); - SDL_SetWindowSize(window_, base_screen_width_ * DEFAULT_WINDOW_ZOOM, base_screen_height_ * DEFAULT_WINDOW_ZOOM); + SDL_SetWindowSize(window_, base_screen_width_ * current_window_zoom_, base_screen_height_ * current_window_zoom_); + SDL_SetWindowPosition(window_, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); // Restaurar presentación lógica base SDL_SetRenderLogicalPresentation(renderer_, base_screen_width_, base_screen_height_, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE);