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:
+43
-43
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user