afegida veu: good job commander

calibrats els volumnes de musica i efectes
afegida forma: ship2.shp
canviat tamany de textos de canvi de pantalla
This commit is contained in:
2025-12-04 18:27:39 +01:00
parent 1dd87c0707
commit 789cbbc593
8 changed files with 38 additions and 9 deletions

24
data/shapes/ship2.shp Normal file
View File

@@ -0,0 +1,24 @@
# ship2.shp - Nau del jugador (triangle amb base còncava - punta de fletxa)
# © 1999 Visente i Sergi (versió Pascal)
# © 2025 Port a C++20 amb SDL3
name: ship2
scale: 1.0
center: 0, 0
# Triangle amb base còncava tipus "punta de fletxa"
# Punts originals (polar):
# p1: r=12, angle=270° (3π/2) → punta amunt
# p2: r=12, angle=45° (π/4) → base dreta-darrere
# p3: r=12, angle=135° (3π/4) → base esquerra-darrere
#
# MODIFICACIÓ: afegit p4 al mig de la base, desplaçat cap al centre
# p4: (0, 4) → punt central de la base, cap endins
#
# Conversió polar→cartesià (angle-90° perquè origen visual és amunt):
# p1: (0, -12) → punta
# p2: (8.49, 8.49) → base dreta
# p4: (0, 4) → base centre (cap endins)
# p3: (-8.49, 8.49) → base esquerra
polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12

Binary file not shown.

Binary file not shown.

View File

@@ -169,10 +169,11 @@ constexpr int FADE_DURATION_MS = 1000; // Fade out duration
// Efectes de so (sons puntuals) // Efectes de so (sons puntuals)
namespace Sound { namespace Sound {
constexpr float VOLUME = 1.0F; // Volumen efectos constexpr float VOLUME = 1.0F; // Volumen efectos
constexpr bool ENABLED = true; // Sonidos habilitados constexpr bool ENABLED = true; // Sonidos habilitados
constexpr const char* EXPLOSION = "explosion.wav"; // Explosión constexpr const char* EXPLOSION = "explosion.wav"; // Explosión
constexpr const char* LASER = "laser_shoot.wav"; // Disparo constexpr const char* LASER = "laser_shoot.wav"; // Disparo
constexpr const char* GOOD_JOB_COMMANDER = "good_job_commander.wav"; // Voz: "Good job, commander"
} // namespace Sound } // namespace Sound
// Enemy type configuration (tipus d'enemics) // Enemy type configuration (tipus d'enemics)

View File

@@ -165,6 +165,8 @@ auto Director::run() -> int {
// Inicialitzar sistema d'audio // Inicialitzar sistema d'audio
Audio::init(); Audio::init();
Audio::get()->setMusicVolume(1.0);
Audio::get()->setSoundVolume(0.4);
// Precachejar música per evitar lag al començar // Precachejar música per evitar lag al començar
AudioCache::getMusic("title.ogg"); AudioCache::getMusic("title.ogg");

View File

@@ -22,7 +22,7 @@ Nau::Nau(SDL_Renderer* renderer)
esta_tocada_(false), esta_tocada_(false),
brightness_(Defaults::Brightness::NAU) { brightness_(Defaults::Brightness::NAU) {
// [NUEVO] Carregar forma compartida des de fitxer // [NUEVO] Carregar forma compartida des de fitxer
forma_ = Graphics::ShapeLoader::load("ship.shp"); forma_ = Graphics::ShapeLoader::load("ship2.shp");
if (!forma_ || !forma_->es_valida()) { if (!forma_ || !forma_->es_valida()) {
std::cerr << "[Nau] Error: no s'ha pogut carregar ship.shp" << std::endl; std::cerr << "[Nau] Error: no s'ha pogut carregar ship.shp" << std::endl;

View File

@@ -244,6 +244,7 @@ void EscenaJoc::actualitzar(float delta_time) {
auto& spawn_ctrl = stage_manager_->get_spawn_controller(); auto& spawn_ctrl = stage_manager_->get_spawn_controller();
if (spawn_ctrl.tots_enemics_destruits(orni_)) { if (spawn_ctrl.tots_enemics_destruits(orni_)) {
stage_manager_->stage_completat(); stage_manager_->stage_completat();
Audio::get()->playSound(Defaults::Sound::GOOD_JOB_COMMANDER, Audio::Group::GAME);
break; break;
} }
} }
@@ -573,8 +574,8 @@ void EscenaJoc::detectar_col·lisio_nau_enemics() {
// [NEW] Stage system helper methods // [NEW] Stage system helper methods
void EscenaJoc::dibuixar_missatge_stage(const std::string& missatge) { void EscenaJoc::dibuixar_missatge_stage(const std::string& missatge) {
constexpr float escala = 1.5f; constexpr float escala = 1.0f;
constexpr float spacing = 3.0f; constexpr float spacing = 2.0f;
float text_width = text_.get_text_width(missatge, escala, spacing); float text_width = text_.get_text_width(missatge, escala, spacing);
float text_height = text_.get_text_height(escala); float text_height = text_.get_text_height(escala);

View File

@@ -411,7 +411,7 @@ void EscenaTitol::dibuixar() {
return; return;
} }
// Estat MAIN i TRANSITION: Dibuixar títol i text (sobre el starfield) // Estat MAIN i TRANSITION_TO_GAME: Dibuixar títol i text (sobre el starfield)
if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::TRANSITION_TO_GAME) { if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::TRANSITION_TO_GAME) {
// === Calcular i renderitzar ombra (només si animació activa) === // === Calcular i renderitzar ombra (només si animació activa) ===
if (animacio_activa_) { if (animacio_activa_) {
@@ -567,7 +567,8 @@ void EscenaTitol::processar_events(const SDL_Event& event) {
// Iniciar transició amb fade-out de música // Iniciar transició amb fade-out de música
estat_actual_ = EstatTitol::TRANSITION_TO_GAME; estat_actual_ = EstatTitol::TRANSITION_TO_GAME;
temps_acumulat_ = 0.0f; // Reset del comptador temps_acumulat_ = 0.0f; // Reset del comptador
Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade de 300ms Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade
Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME);
break; break;
case EstatTitol::TRANSITION_TO_GAME: case EstatTitol::TRANSITION_TO_GAME: