From a4f6a5514f00f991a33e20e567b59a5e6f965a84 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 19 May 2026 12:27:12 +0200 Subject: [PATCH] =?UTF-8?q?Fase=202:=20cambio=20de=20resoluci=C3=B3n=20l?= =?UTF-8?q?=C3=B3gica=20640x480=20a=201280x720=20(16:9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El juego pasa de 4:3 a 16:9. Solo se tocan las constantes raíz: todo lo demás (PLAYAREA, SCOREBOARD, CENTER_X/Y, P1/P2_TARGET, VANISHING_POINT, etc.) se deriva de Game::WIDTH/HEIGHT y se recalcula automáticamente. Decisión del usuario: priorizar la base técnica sobre el feeling del juego. Las velocidades, masas, radios de colisión y tamaños de shape se mantienen sin cambios — la nave se verá más pequeña en relación al área de juego y habrá más espacio. El tuning jugable se hará tras completar la migración (post-Fase 7 GPU). Cambios: - Defaults::Window::WIDTH/HEIGHT: 640/480 -> 1280/720 - Defaults::Window::MIN_WIDTH/MIN_HEIGHT: 320/240 -> 640/360 (16:9) - Defaults::Game::WIDTH/HEIGHT: 640/480 -> 1280/720 - Options::Window defaults: width{640}/height{480} -> 1280/720 - logo_scene.cpp: PANTALLA_ANCHO/ALTO ya no hardcoded; deriva de Defaults::Game (era 640/480 magic numbers) - Comentarios obsoletos limpiados en defaults.hpp (// w = 640.0, // 320.0f, etc.) - Catalán residual traducido (marges->márgenes, percentatges->porcentajes, Àrea->Área, contenidor->contenedor, automàtic->automático) Verificado: el ShipAnimator del título usa CENTER_X / CENTER_Y / P1_TARGET_X/Y / VANISHING_POINT_X/Y, todos derivados de Game::WIDTH y Game::HEIGHT. Se reposicionan automáticamente. CLOCK_RADIUS=150 se mantiene (escala relativa al centro). PostFase: con 1280x720 el bug del HUD en ventana puede haber cambiado de síntomas. Verificar visualmente cuando se haga la prueba. Co-Authored-By: Claude Opus 4.7 (1M context) --- source/core/defaults.hpp | 86 +++++++++++++++---------------- source/game/constants.hpp | 2 +- source/game/options.hpp | 4 +- source/game/scenes/logo_scene.cpp | 4 +- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/source/core/defaults.hpp b/source/core/defaults.hpp index 64973ba..687bd08 100644 --- a/source/core/defaults.hpp +++ b/source/core/defaults.hpp @@ -8,38 +8,38 @@ namespace Defaults { // Configuración de ventana namespace Window { -constexpr int WIDTH = 640; -constexpr int HEIGHT = 480; -constexpr int MIN_WIDTH = 320; // Mínimo: mitad del original -constexpr int MIN_HEIGHT = 240; +constexpr int WIDTH = 1280; +constexpr int HEIGHT = 720; +constexpr int MIN_WIDTH = 640; // Mínimo: mitad del baseline (16:9) +constexpr int MIN_HEIGHT = 360; // Zoom system -constexpr float BASE_ZOOM = 1.0F; // 640x480 baseline -constexpr float MIN_ZOOM = 0.5F; // 320x240 minimum +constexpr float BASE_ZOOM = 1.0F; // 1280x720 baseline (16:9) +constexpr float MIN_ZOOM = 0.5F; // 640x360 minimum constexpr float ZOOM_INCREMENT = 0.1F; // 10% steps (F1/F2) -constexpr bool FULLSCREEN = true; // Pantalla completa activadapor defecto +constexpr bool FULLSCREEN = true; // Pantalla completa activada por defecto } // namespace Window -// Dimensions base del juego (coordenades lògiques) +// Dimensiones base del juego (coordenadas lógicas, 16:9) namespace Game { -constexpr int WIDTH = 640; -constexpr int HEIGHT = 480; +constexpr int WIDTH = 1280; +constexpr int HEIGHT = 720; } // namespace Game -// Zones del juego (SDL_FRect con cálculos automàtics basat en percentatges) +// Zones del juego (SDL_FRect con cálculos automáticos basat en porcentajes) namespace Zones { // --- CONFIGURACIÓ DE PORCENTATGES --- -// Todas las zones definides como a percentatges de Game::WIDTH (640) i Game::HEIGHT (480) +// Todas las zones definides como a porcentajes de Game::WIDTH (640) i Game::HEIGHT (480) // Percentatges de height (divisió vertical) constexpr float SCOREBOARD_TOP_HEIGHT_PERCENT = 0.02F; // 10% superior constexpr float MAIN_PLAYAREA_HEIGHT_PERCENT = 0.88F; // 80% central constexpr float SCOREBOARD_BOTTOM_HEIGHT_PERCENT = 0.10F; // 10% inferior -// Padding horizontal para PLAYAREA (dins de MAIN_PLAYAREA) +// Padding horizontal para PLAYAREA (dentro de MAIN_PLAYAREA) constexpr float PLAYAREA_PADDING_HORIZONTAL_PERCENT = 0.015F; // 5% a cada costat // --- CÀLCULS AUTOMÀTICS DE PÍXELS --- -// Cálculos automàtics a partir dels percentatges +// Cálculos automáticos a partir dels porcentajes // Alçades constexpr float SCOREBOARD_TOP_H = Game::HEIGHT * SCOREBOARD_TOP_HEIGHT_PERCENT; @@ -56,44 +56,44 @@ constexpr float PLAYAREA_PADDING_H = Game::WIDTH * PLAYAREA_PADDING_HORIZONTAL_P // --- ZONES FINALS (SDL_FRect) --- -// Marcador superior (reservat para futur ús) -// Ocupa: 10% superior (0-48px) +// Marcador superior (reservado para futuro uso) +// Ocupa el 2% superior constexpr SDL_FRect SCOREBOARD_TOP = { 0.0F, // x = 0.0 SCOREBOARD_TOP_Y, // y = 0.0 - static_cast(Game::WIDTH), // w = 640.0 - SCOREBOARD_TOP_H // h = 48.0 + static_cast(Game::WIDTH), // ancho completo + SCOREBOARD_TOP_H // alto }; -// Àrea de juego principal (contenidor del 80% central, sin padding) -// Ocupa: 10-90% (48-432px), ample complet +// Área de juego principal (contenedor del 80% central, sin padding) +// Ocupa el 88% central, ancho completo constexpr SDL_FRect MAIN_PLAYAREA = { 0.0F, // x = 0.0 - MAIN_PLAYAREA_Y, // y = 48.0 - static_cast(Game::WIDTH), // w = 640.0 - MAIN_PLAYAREA_H // h = 384.0 + MAIN_PLAYAREA_Y, // debajo del scoreboard superior + static_cast(Game::WIDTH), // ancho completo + MAIN_PLAYAREA_H // alto }; // Zona de juego real (con padding horizontal del 5%) -// Ocupa: dins de MAIN_PLAYAREA, con marges laterals -// S'utilitza para límits del juego, colisiones, spawn +// Ocupa: dentro de MAIN_PLAYAREA, con márgenes laterales +// Se utiliza para límites del juego, colisiones, spawn constexpr SDL_FRect PLAYAREA = { - PLAYAREA_PADDING_H, // x = 32.0 - MAIN_PLAYAREA_Y, // y = 48.0 (igual que MAIN_PLAYAREA) - Game::WIDTH - (2.0F * PLAYAREA_PADDING_H), // w = 576.0 - MAIN_PLAYAREA_H // h = 384.0 (igual que MAIN_PLAYAREA) + PLAYAREA_PADDING_H, // padding horizontal + MAIN_PLAYAREA_Y, // debajo del scoreboard superior (igual que MAIN_PLAYAREA) + Game::WIDTH - (2.0F * PLAYAREA_PADDING_H), // ancho con padding + MAIN_PLAYAREA_H // alto (igual que MAIN_PLAYAREA) }; // Marcador inferior (marcador actual) -// Ocupa: 10% inferior (432-480px) +// Ocupa el 10% inferior constexpr SDL_FRect SCOREBOARD = { 0.0F, // x = 0.0 - SCOREBOARD_BOTTOM_Y, // y = 432.0 - static_cast(Game::WIDTH), // w = 640.0 - SCOREBOARD_BOTTOM_H // h = 48.0 + SCOREBOARD_BOTTOM_Y, // fondo + static_cast(Game::WIDTH), // ancho completo + SCOREBOARD_BOTTOM_H // alto }; -// Padding horizontal del marcador (per alinear zones izquierda/derecha con PLAYAREA) +// Padding horizontal del marcador (para alinear zonas izquierda/derecha con PLAYAREA) constexpr float SCOREBOARD_PADDING_H = 0.0F; // Game::WIDTH * 0.015f; } // namespace Zones @@ -143,7 +143,7 @@ constexpr float LEVEL_COMPLETED_TYPING_RATIO = 0.0F; // 0.0 = sin typewriter (d constexpr float INIT_HUD_DURATION = 3.0F; // Duración total del estado // Ratios de animación (inicio y fin como porcentajes del tiempo total) -// RECT (rectángulo de marges) +// RECT (rectángulo de márgenes) constexpr float INIT_HUD_RECT_RATIO_INIT = 0.30F; constexpr float INIT_HUD_RECT_RATIO_END = 0.85F; @@ -422,7 +422,7 @@ constexpr float TARGET_Y_RATIO = 0.15625F; constexpr float CLOCK_RADIUS = 150.0F; // Distancia des del centro // 4. Ángulos de posición (clock positions en coordenadas polares) -// En coordenades de pantalla: 0° = derecha, 90° = baix, 180° = izquierda, 270° = dalt +// En coordenadas de pantalla: 0° = derecha, 90° = baix, 180° = izquierda, 270° = dalt constexpr float CLOCK_8_ANGLE = 150.0F * Math::PI / 180.0F; // 8 o'clock (bottom-left) constexpr float CLOCK_4_ANGLE = 30.0F * Math::PI / 180.0F; // 4 o'clock (bottom-right) @@ -433,12 +433,12 @@ constexpr float SHIP_MAX_RADIUS = 30.0F; // Radi del cercle circumscrit a ship_ constexpr float ENTRY_OFFSET_MARGIN = 227.5F; // Para offset total de ~340px (ajustado) // ============================================================ -// VALORS DERIVATS (calculats automàticament - NO modificar) +// VALORS DERIVATS (calculats automáticoament - NO modificar) // ============================================================ // Centro de la pantalla (point de referència) -constexpr float CENTER_X = Game::WIDTH / 2.0F; // 320.0f -constexpr float CENTER_Y = Game::HEIGHT / 2.0F; // 240.0f +constexpr float CENTER_X = Game::WIDTH / 2.0F; // auto-derivado de Game::WIDTH +constexpr float CENTER_Y = Game::HEIGHT / 2.0F; // auto-derivado de Game::HEIGHT // Posicions target (calculades dinàmicament des dels parámetros base) // Nota: std::cos/sin no són constexpr en C++20, pero funcionen en runtime @@ -460,13 +460,13 @@ inline float P2_TARGET_Y() { constexpr float ENTRY_SCALE_START = 1.5F * SHIP_BASE_SCALE; // Entrada: 50% més grande constexpr float FLOATING_SCALE = 1.0F * SHIP_BASE_SCALE; // Flotante: scale base -// Offset de entrada (ajustat automàticament a l'scale) -// Fórmula: (radi màxim de la ship * scale de entrada) + marge +// Offset de entrada (ajustat automáticoament a l'scale) +// Fórmula: (radi màxim de la ship * scale de entrada) + margen constexpr float ENTRY_OFFSET = (SHIP_MAX_RADIUS * ENTRY_SCALE_START) + ENTRY_OFFSET_MARGIN; // Vec2 de fuga (centro para l'animación de salida) -constexpr float VANISHING_POINT_X = CENTER_X; // 320.0f -constexpr float VANISHING_POINT_Y = CENTER_Y; // 240.0f +constexpr float VANISHING_POINT_X = CENTER_X; // auto-derivado de Game::WIDTH +constexpr float VANISHING_POINT_Y = CENTER_Y; // auto-derivado de Game::HEIGHT // ============================================================ // ANIMACIONS (durades, oscil·lacions, delays) diff --git a/source/game/constants.hpp b/source/game/constants.hpp index bb6aa2a..82bb20a 100644 --- a/source/game/constants.hpp +++ b/source/game/constants.hpp @@ -6,7 +6,7 @@ // Permet usar Constants::MARGIN_LEFT en lloc de Defaults::Game::MARGIN_LEFT namespace Constants { -// Marges de l'àrea de juego (derivats de Defaults::Zones::GAME) +// Márgenes de l'àrea de juego (derivats de Defaults::Zones::GAME) constexpr int MARGIN_LEFT = static_cast(Defaults::Zones::PLAYAREA.x); constexpr int MARGIN_RIGHT = static_cast(Defaults::Zones::PLAYAREA.x + Defaults::Zones::PLAYAREA.w); diff --git a/source/game/options.hpp b/source/game/options.hpp index 65af46e..4fccd64 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -9,8 +9,8 @@ namespace Options { // Estructures de configuración struct Window { - int width{640}; - int height{480}; + int width{1280}; + int height{720}; bool fullscreen{false}; float zoom_factor{1.0F}; // Zoom level (0.5x to max_zoom) }; diff --git a/source/game/scenes/logo_scene.cpp b/source/game/scenes/logo_scene.cpp index 4bc4f90..f0383aa 100644 --- a/source/game/scenes/logo_scene.cpp +++ b/source/game/scenes/logo_scene.cpp @@ -178,8 +178,8 @@ void LogoScene::inicialitzar_lletres() { ancho_total += ESPAI_ENTRE_LLETRES * (lletres_.size() - 1); // Pas 3: Calcular posición inicial (centrat horitzontal) - constexpr float PANTALLA_ANCHO = 640.0F; - constexpr float PANTALLA_ALTO = 480.0F; + constexpr auto PANTALLA_ANCHO = static_cast(Defaults::Game::WIDTH); + constexpr auto PANTALLA_ALTO = static_cast(Defaults::Game::HEIGHT); float x_inicial = (PANTALLA_ANCHO - ancho_total) / 2.0F; float y_centre = PANTALLA_ALTO / 2.0F;