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:
24
data/shapes/ship2.shp
Normal file
24
data/shapes/ship2.shp
Normal 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
|
||||||
BIN
data/sounds/good_job_commander.wav
Normal file
BIN
data/sounds/good_job_commander.wav
Normal file
Binary file not shown.
BIN
data/voices/good_job_commander.wav
Normal file
BIN
data/voices/good_job_commander.wav
Normal file
Binary file not shown.
@@ -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)
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user