Fase 2: cambio de resolución lógica 640x480 a 1280x720 (16:9)

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) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 12:27:12 +02:00
parent 56533caff0
commit a4f6a5514f
4 changed files with 48 additions and 48 deletions
+42 -42
View File
@@ -8,38 +8,38 @@
namespace Defaults { namespace Defaults {
// Configuración de ventana // Configuración de ventana
namespace Window { namespace Window {
constexpr int WIDTH = 640; constexpr int WIDTH = 1280;
constexpr int HEIGHT = 480; constexpr int HEIGHT = 720;
constexpr int MIN_WIDTH = 320; // Mínimo: mitad del original constexpr int MIN_WIDTH = 640; // Mínimo: mitad del baseline (16:9)
constexpr int MIN_HEIGHT = 240; constexpr int MIN_HEIGHT = 360;
// Zoom system // Zoom system
constexpr float BASE_ZOOM = 1.0F; // 640x480 baseline constexpr float BASE_ZOOM = 1.0F; // 1280x720 baseline (16:9)
constexpr float MIN_ZOOM = 0.5F; // 320x240 minimum constexpr float MIN_ZOOM = 0.5F; // 640x360 minimum
constexpr float ZOOM_INCREMENT = 0.1F; // 10% steps (F1/F2) constexpr float ZOOM_INCREMENT = 0.1F; // 10% steps (F1/F2)
constexpr bool FULLSCREEN = true; // Pantalla completa activada por defecto constexpr bool FULLSCREEN = true; // Pantalla completa activada por defecto
} // namespace Window } // namespace Window
// Dimensions base del juego (coordenades lògiques) // Dimensiones base del juego (coordenadas lógicas, 16:9)
namespace Game { namespace Game {
constexpr int WIDTH = 640; constexpr int WIDTH = 1280;
constexpr int HEIGHT = 480; constexpr int HEIGHT = 720;
} // namespace Game } // 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 { namespace Zones {
// --- CONFIGURACIÓ DE PORCENTATGES --- // --- 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) // Percentatges de height (divisió vertical)
constexpr float SCOREBOARD_TOP_HEIGHT_PERCENT = 0.02F; // 10% superior constexpr float SCOREBOARD_TOP_HEIGHT_PERCENT = 0.02F; // 10% superior
constexpr float MAIN_PLAYAREA_HEIGHT_PERCENT = 0.88F; // 80% central constexpr float MAIN_PLAYAREA_HEIGHT_PERCENT = 0.88F; // 80% central
constexpr float SCOREBOARD_BOTTOM_HEIGHT_PERCENT = 0.10F; // 10% inferior 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 constexpr float PLAYAREA_PADDING_HORIZONTAL_PERCENT = 0.015F; // 5% a cada costat
// --- CÀLCULS AUTOMÀTICS DE PÍXELS --- // --- 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 // Alçades
constexpr float SCOREBOARD_TOP_H = Game::HEIGHT * SCOREBOARD_TOP_HEIGHT_PERCENT; 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) --- // --- ZONES FINALS (SDL_FRect) ---
// Marcador superior (reservat para futur ús) // Marcador superior (reservado para futuro uso)
// Ocupa: 10% superior (0-48px) // Ocupa el 2% superior
constexpr SDL_FRect SCOREBOARD_TOP = { constexpr SDL_FRect SCOREBOARD_TOP = {
0.0F, // x = 0.0 0.0F, // x = 0.0
SCOREBOARD_TOP_Y, // y = 0.0 SCOREBOARD_TOP_Y, // y = 0.0
static_cast<float>(Game::WIDTH), // w = 640.0 static_cast<float>(Game::WIDTH), // ancho completo
SCOREBOARD_TOP_H // h = 48.0 SCOREBOARD_TOP_H // alto
}; };
// Àrea de juego principal (contenidor del 80% central, sin padding) // Área de juego principal (contenedor del 80% central, sin padding)
// Ocupa: 10-90% (48-432px), ample complet // Ocupa el 88% central, ancho completo
constexpr SDL_FRect MAIN_PLAYAREA = { constexpr SDL_FRect MAIN_PLAYAREA = {
0.0F, // x = 0.0 0.0F, // x = 0.0
MAIN_PLAYAREA_Y, // y = 48.0 MAIN_PLAYAREA_Y, // debajo del scoreboard superior
static_cast<float>(Game::WIDTH), // w = 640.0 static_cast<float>(Game::WIDTH), // ancho completo
MAIN_PLAYAREA_H // h = 384.0 MAIN_PLAYAREA_H // alto
}; };
// Zona de juego real (con padding horizontal del 5%) // Zona de juego real (con padding horizontal del 5%)
// Ocupa: dins de MAIN_PLAYAREA, con marges laterals // Ocupa: dentro de MAIN_PLAYAREA, con márgenes laterales
// S'utilitza para límits del juego, colisiones, spawn // Se utiliza para límites del juego, colisiones, spawn
constexpr SDL_FRect PLAYAREA = { constexpr SDL_FRect PLAYAREA = {
PLAYAREA_PADDING_H, // x = 32.0 PLAYAREA_PADDING_H, // padding horizontal
MAIN_PLAYAREA_Y, // y = 48.0 (igual que MAIN_PLAYAREA) MAIN_PLAYAREA_Y, // debajo del scoreboard superior (igual que MAIN_PLAYAREA)
Game::WIDTH - (2.0F * PLAYAREA_PADDING_H), // w = 576.0 Game::WIDTH - (2.0F * PLAYAREA_PADDING_H), // ancho con padding
MAIN_PLAYAREA_H // h = 384.0 (igual que MAIN_PLAYAREA) MAIN_PLAYAREA_H // alto (igual que MAIN_PLAYAREA)
}; };
// Marcador inferior (marcador actual) // Marcador inferior (marcador actual)
// Ocupa: 10% inferior (432-480px) // Ocupa el 10% inferior
constexpr SDL_FRect SCOREBOARD = { constexpr SDL_FRect SCOREBOARD = {
0.0F, // x = 0.0 0.0F, // x = 0.0
SCOREBOARD_BOTTOM_Y, // y = 432.0 SCOREBOARD_BOTTOM_Y, // fondo
static_cast<float>(Game::WIDTH), // w = 640.0 static_cast<float>(Game::WIDTH), // ancho completo
SCOREBOARD_BOTTOM_H // h = 48.0 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; constexpr float SCOREBOARD_PADDING_H = 0.0F; // Game::WIDTH * 0.015f;
} // namespace Zones } // 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 constexpr float INIT_HUD_DURATION = 3.0F; // Duración total del estado
// Ratios de animación (inicio y fin como porcentajes del tiempo total) // 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_INIT = 0.30F;
constexpr float INIT_HUD_RECT_RATIO_END = 0.85F; 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 constexpr float CLOCK_RADIUS = 150.0F; // Distancia des del centro
// 4. Ángulos de posición (clock positions en coordenadas polares) // 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_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) 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) 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) // Centro de la pantalla (point de referència)
constexpr float CENTER_X = Game::WIDTH / 2.0F; // 320.0f constexpr float CENTER_X = Game::WIDTH / 2.0F; // auto-derivado de Game::WIDTH
constexpr float CENTER_Y = Game::HEIGHT / 2.0F; // 240.0f constexpr float CENTER_Y = Game::HEIGHT / 2.0F; // auto-derivado de Game::HEIGHT
// Posicions target (calculades dinàmicament des dels parámetros base) // 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 // 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 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 constexpr float FLOATING_SCALE = 1.0F * SHIP_BASE_SCALE; // Flotante: scale base
// Offset de entrada (ajustat automàticament a l'scale) // Offset de entrada (ajustat automáticoament a l'scale)
// Fórmula: (radi màxim de la ship * scale de entrada) + marge // 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; constexpr float ENTRY_OFFSET = (SHIP_MAX_RADIUS * ENTRY_SCALE_START) + ENTRY_OFFSET_MARGIN;
// Vec2 de fuga (centro para l'animación de salida) // Vec2 de fuga (centro para l'animación de salida)
constexpr float VANISHING_POINT_X = CENTER_X; // 320.0f constexpr float VANISHING_POINT_X = CENTER_X; // auto-derivado de Game::WIDTH
constexpr float VANISHING_POINT_Y = CENTER_Y; // 240.0f constexpr float VANISHING_POINT_Y = CENTER_Y; // auto-derivado de Game::HEIGHT
// ============================================================ // ============================================================
// ANIMACIONS (durades, oscil·lacions, delays) // ANIMACIONS (durades, oscil·lacions, delays)
+1 -1
View File
@@ -6,7 +6,7 @@
// Permet usar Constants::MARGIN_LEFT en lloc de Defaults::Game::MARGIN_LEFT // Permet usar Constants::MARGIN_LEFT en lloc de Defaults::Game::MARGIN_LEFT
namespace Constants { 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<int>(Defaults::Zones::PLAYAREA.x); constexpr int MARGIN_LEFT = static_cast<int>(Defaults::Zones::PLAYAREA.x);
constexpr int MARGIN_RIGHT = constexpr int MARGIN_RIGHT =
static_cast<int>(Defaults::Zones::PLAYAREA.x + Defaults::Zones::PLAYAREA.w); static_cast<int>(Defaults::Zones::PLAYAREA.x + Defaults::Zones::PLAYAREA.w);
+2 -2
View File
@@ -9,8 +9,8 @@ namespace Options {
// Estructures de configuración // Estructures de configuración
struct Window { struct Window {
int width{640}; int width{1280};
int height{480}; int height{720};
bool fullscreen{false}; bool fullscreen{false};
float zoom_factor{1.0F}; // Zoom level (0.5x to max_zoom) float zoom_factor{1.0F}; // Zoom level (0.5x to max_zoom)
}; };
+2 -2
View File
@@ -178,8 +178,8 @@ void LogoScene::inicialitzar_lletres() {
ancho_total += ESPAI_ENTRE_LLETRES * (lletres_.size() - 1); ancho_total += ESPAI_ENTRE_LLETRES * (lletres_.size() - 1);
// Pas 3: Calcular posición inicial (centrat horitzontal) // Pas 3: Calcular posición inicial (centrat horitzontal)
constexpr float PANTALLA_ANCHO = 640.0F; constexpr auto PANTALLA_ANCHO = static_cast<float>(Defaults::Game::WIDTH);
constexpr float PANTALLA_ALTO = 480.0F; constexpr auto PANTALLA_ALTO = static_cast<float>(Defaults::Game::HEIGHT);
float x_inicial = (PANTALLA_ANCHO - ancho_total) / 2.0F; float x_inicial = (PANTALLA_ANCHO - ancho_total) / 2.0F;
float y_centre = PANTALLA_ALTO / 2.0F; float y_centre = PANTALLA_ALTO / 2.0F;