afegit sistema de punts

This commit is contained in:
2025-12-09 16:56:07 +01:00
parent 76165e4345
commit 94a7a38cdd
8 changed files with 251 additions and 5 deletions

View File

@@ -26,8 +26,10 @@ EscenaJoc::EscenaJoc(SDLManager& sdl, ContextEscenes& context)
: sdl_(sdl),
context_(context),
debris_manager_(sdl.obte_renderer()),
gestor_puntuacio_(sdl.obte_renderer()),
nau_(sdl.obte_renderer()),
itocado_(0),
puntuacio_total_(0),
text_(sdl.obte_renderer()) {
// Consumir opcions (preparació per MODE_DEMO futur)
auto opcio = context_.consumir_opcio();
@@ -140,6 +142,10 @@ void EscenaJoc::inicialitzar() {
game_over_ = false;
game_over_timer_ = 0.0f;
// Initialize score
puntuacio_total_ = 0;
gestor_puntuacio_.reiniciar();
// Set spawn point to center of play area
Constants::obtenir_centre_zona(punt_spawn_.x, punt_spawn_.y);
@@ -187,6 +193,7 @@ void EscenaJoc::actualitzar(float delta_time) {
}
debris_manager_.actualitzar(delta_time);
gestor_puntuacio_.actualitzar(delta_time);
return;
}
@@ -224,6 +231,7 @@ void EscenaJoc::actualitzar(float delta_time) {
}
debris_manager_.actualitzar(delta_time);
gestor_puntuacio_.actualitzar(delta_time);
return;
}
@@ -279,6 +287,7 @@ void EscenaJoc::actualitzar(float delta_time) {
detectar_col·lisions_bales_enemics();
detectar_col·lisio_nau_enemics();
debris_manager_.actualitzar(delta_time);
gestor_puntuacio_.actualitzar(delta_time);
break;
}
@@ -297,6 +306,7 @@ void EscenaJoc::actualitzar(float delta_time) {
// [NEW] Update debris (from last destroyed enemies)
debris_manager_.actualitzar(delta_time);
gestor_puntuacio_.actualitzar(delta_time);
break;
}
}
@@ -318,6 +328,7 @@ void EscenaJoc::dibuixar() {
}
debris_manager_.dibuixar();
gestor_puntuacio_.dibuixar();
// Draw centered "GAME OVER" text
const std::string game_over_text = "GAME OVER";
@@ -354,6 +365,7 @@ void EscenaJoc::dibuixar() {
// [NEW] Draw debris
debris_manager_.dibuixar();
gestor_puntuacio_.dibuixar();
// [EXISTING] Draw intro message and score
dibuixar_missatge_stage(StageSystem::Constants::MISSATGE_LEVEL_START);
@@ -375,6 +387,7 @@ void EscenaJoc::dibuixar() {
}
debris_manager_.dibuixar();
gestor_puntuacio_.dibuixar();
dibuixar_marcador();
break;
@@ -391,6 +404,7 @@ void EscenaJoc::dibuixar() {
// [NEW] Draw debris (from last destroyed enemies)
debris_manager_.dibuixar();
gestor_puntuacio_.dibuixar();
// [EXISTING] Draw completion message and score
dibuixar_missatge_stage(StageSystem::Constants::MISSATGE_LEVEL_COMPLETED);
@@ -518,7 +532,11 @@ void EscenaJoc::dibuixar_marcador() {
std::string stage_str = (stage_num < 10) ? "0" + std::to_string(stage_num)
: std::to_string(stage_num);
std::string text = "SCORE: 01000 LIFES: " + std::to_string(num_vides_) +
// Format score with padding to 5 digits (e.g., 150 → "00150")
std::string score_str = std::to_string(puntuacio_total_);
score_str = std::string(5 - std::min(5, static_cast<int>(score_str.length())), '0') + score_str;
std::string text = "SCORE: " + score_str + " LIFES: " + std::to_string(num_vides_) +
" LEVEL: " + stage_str;
// Paràmetres de renderització
@@ -580,7 +598,27 @@ void EscenaJoc::detectar_col·lisions_bales_enemics() {
if (distancia_quadrada <= SUMA_RADIS_QUADRAT) {
// *** COL·LISIÓ DETECTADA ***
// 1. Destruir enemic (marca com inactiu)
// 1. Calculate score for enemy type
int punts = 0;
switch (enemic.get_tipus()) {
case TipusEnemic::PENTAGON:
punts = Defaults::Enemies::Scoring::PENTAGON_SCORE;
break;
case TipusEnemic::QUADRAT:
punts = Defaults::Enemies::Scoring::QUADRAT_SCORE;
break;
case TipusEnemic::MOLINILLO:
punts = Defaults::Enemies::Scoring::MOLINILLO_SCORE;
break;
}
// 2. Add to total score
puntuacio_total_ += punts;
// 3. Create floating score number
gestor_puntuacio_.crear(punts, pos_enemic);
// 4. Destruir enemic (marca com inactiu)
enemic.destruir();
// 2. Crear explosió de fragments