168 lines
6.1 KiB
C++
168 lines
6.1 KiB
C++
#pragma once
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <cstdint>
|
|
|
|
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<float>(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
|