#pragma once #include #include 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; // Zoom system constexpr float BASE_ZOOM = 1.0f; // 640x480 baseline constexpr float MIN_ZOOM = 0.5f; // 320x240 minimum constexpr float ZOOM_INCREMENT = 0.1f; // 10% steps (F1/F2) } // namespace Window // Dimensions base del joc (coordenades lògiques) namespace Game { constexpr int WIDTH = 640; constexpr int HEIGHT = 480; } // namespace Game // Zones del joc (SDL_FRect amb càlculs automàtics) namespace Zones { // --- CONFIGURACIÓ DE PORCENTATGES --- // Basats en valors originals 640x480 // Ajusta estos valors per canviar proporcions constexpr float PLAYAREA_MARGIN_HORIZONTAL_PERCENT = 10.0f / Game::WIDTH; constexpr float PLAYAREA_MARGIN_VERTICAL_PERCENT = 10.0f / Game::HEIGHT; constexpr float SCOREBOARD_HEIGHT_PERCENT = 48.0f / Game::HEIGHT; // --- CÀLCULS AUTOMÀTICS --- // Estos valors es recalculen si canvien Game::WIDTH o Game::HEIGHT constexpr float PLAYAREA_MARGIN_H = Game::WIDTH * PLAYAREA_MARGIN_HORIZONTAL_PERCENT; constexpr float PLAYAREA_MARGIN_V = Game::HEIGHT * PLAYAREA_MARGIN_VERTICAL_PERCENT; constexpr float SCOREBOARD_H = Game::HEIGHT * SCOREBOARD_HEIGHT_PERCENT; // --- ZONES FINALS (SDL_FRect) --- // Zona de joc principal // Ocupa: tot menys marges (dalt, esq, dret) i scoreboard (baix) constexpr SDL_FRect PLAYAREA = { PLAYAREA_MARGIN_H, // x = 10.0 PLAYAREA_MARGIN_V, // y = 10.0 Game::WIDTH - 2.0f * PLAYAREA_MARGIN_H, // width = 620.0 Game::HEIGHT - PLAYAREA_MARGIN_V - SCOREBOARD_H // height = 406.0 }; // Zona de marcador // Ocupa: tot l'ample, 64px d'alçada en la part inferior constexpr SDL_FRect SCOREBOARD = { 0.0f, // x = 0.0 Game::HEIGHT - SCOREBOARD_H, // y = 416.0 static_cast(Game::WIDTH), // width = 640.0 SCOREBOARD_H // height = 64.0 }; } // namespace Zones // Objetos del juego namespace Entities { constexpr int MAX_ORNIS = 15; constexpr int MAX_BALES = 3; constexpr int MAX_IPUNTS = 30; constexpr float SHIP_RADIUS = 12.0f; constexpr float ENEMY_RADIUS = 20.0f; constexpr float BULLET_RADIUS = 5.0f; } // namespace Entities // Física (valores actuales del juego, sincronizados con joc_asteroides.cpp) namespace Physics { constexpr float ROTATION_SPEED = 3.14f; // rad/s (~180°/s) constexpr float ACCELERATION = 400.0f; // px/s² constexpr float MAX_VELOCITY = 120.0f; // px/s constexpr float FRICTION = 20.0f; // px/s² constexpr float ENEMY_SPEED = 2.0f; // unidades/frame constexpr float BULLET_SPEED = 6.0f; // unidades/frame constexpr float VELOCITY_SCALE = 20.0f; // factor conversión frame→tiempo // Explosions (debris physics) namespace Debris { constexpr float VELOCITAT_BASE = 80.0f; // Velocitat inicial (px/s) constexpr float VARIACIO_VELOCITAT = 40.0f; // ±variació aleatòria (px/s) constexpr float ACCELERACIO = -60.0f; // Fricció/desacceleració (px/s²) constexpr float ROTACIO_MIN = 0.1f; // Rotació mínima (rad/s ~5.7°/s) constexpr float ROTACIO_MAX = 0.3f; // Rotació màxima (rad/s ~17.2°/s) constexpr float TEMPS_VIDA = 2.0f; // Duració màxima (segons) constexpr float SHRINK_RATE = 0.5f; // Reducció de mida (factor/s) } // namespace Debris } // namespace Physics // Matemáticas namespace Math { constexpr float PI = 3.14159265359f; } // namespace Math // Colores (oscilación para efecto CRT) namespace Color { // Frecuencia de oscilación constexpr float FREQUENCY = 6.0f; // 1 Hz (1 ciclo/segundo) // Color de líneas (efecto fósforo verde CRT) constexpr uint8_t LINE_MIN_R = 100; // Verde oscuro constexpr uint8_t LINE_MIN_G = 200; constexpr uint8_t LINE_MIN_B = 100; constexpr uint8_t LINE_MAX_R = 100; // Verde brillante constexpr uint8_t LINE_MAX_G = 255; constexpr uint8_t LINE_MAX_B = 100; // Color de fondo (pulso sutil verde oscuro) constexpr uint8_t BACKGROUND_MIN_R = 0; // Negro constexpr uint8_t BACKGROUND_MIN_G = 5; constexpr uint8_t BACKGROUND_MIN_B = 0; constexpr uint8_t BACKGROUND_MAX_R = 0; // Verde muy oscuro constexpr uint8_t BACKGROUND_MAX_G = 15; constexpr uint8_t BACKGROUND_MAX_B = 0; } // namespace Color // Brillantor (control de intensitat per cada tipus d'entitat) namespace Brightness { // Brillantor estàtica per entitats de joc (0.0-1.0) constexpr float NAU = 1.0f; // Màxima visibilitat (jugador) constexpr float ENEMIC = 0.7f; // 30% més tènue (destaca menys) constexpr float BALA = 0.9f; // Destacada però menys que nau // Starfield: gradient segons distància al centre // distancia_centre: 0.0 (centre) → 1.0 (vora pantalla) // brightness = MIN + (MAX - MIN) * distancia_centre constexpr float STARFIELD_MIN = 0.3f; // Estrelles llunyanes (prop del centre) constexpr float STARFIELD_MAX = 0.8f; // Estrelles properes (vora pantalla) } // namespace Brightness // Renderització (V-Sync i altres opcions de render) namespace Rendering { constexpr int VSYNC_DEFAULT = 1; // 0=disabled, 1=enabled } // namespace Rendering // Audio (sistema de so i música) namespace Audio { constexpr float VOLUME = 1.0F; // Volumen maestro (0.0 a 1.0) constexpr bool ENABLED = true; // Audio habilitado por defecto } // namespace Audio // Música (pistas de fondo) namespace Music { constexpr float VOLUME = 0.8F; // Volumen música constexpr bool ENABLED = true; // Música habilitada constexpr const char* GAME_TRACK = "game.ogg"; // Pista de juego constexpr int FADE_DURATION_MS = 1000; // Fade out duration } // namespace Music // Efectes de so (sons puntuals) namespace Sound { constexpr float VOLUME = 1.0F; // Volumen efectos constexpr bool ENABLED = true; // Sonidos habilitados constexpr const char* EXPLOSION = "explosion.wav"; // Explosión constexpr const char* LASER = "laser_shoot.wav"; // Disparo } // namespace Sound } // namespace Defaults