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
+43 -43
View File
@@ -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<float>(Game::WIDTH), // w = 640.0
SCOREBOARD_TOP_H // h = 48.0
static_cast<float>(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<float>(Game::WIDTH), // w = 640.0
MAIN_PLAYAREA_H // h = 384.0
MAIN_PLAYAREA_Y, // debajo del scoreboard superior
static_cast<float>(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<float>(Game::WIDTH), // w = 640.0
SCOREBOARD_BOTTOM_H // h = 48.0
SCOREBOARD_BOTTOM_Y, // fondo
static_cast<float>(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)
+1 -1
View File
@@ -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<int>(Defaults::Zones::PLAYAREA.x);
constexpr int MARGIN_RIGHT =
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
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)
};
+2 -2
View File
@@ -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<float>(Defaults::Game::WIDTH);
constexpr auto PANTALLA_ALTO = static_cast<float>(Defaults::Game::HEIGHT);
float x_inicial = (PANTALLA_ANCHO - ancho_total) / 2.0F;
float y_centre = PANTALLA_ALTO / 2.0F;