From 659a4ced44e120092e99fa782a0cf5bf0ee55c1e Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 10 Aug 2025 20:36:13 +0200 Subject: [PATCH] fix: el nom apareixia duplicat en la tabla de records --- source/player.cpp | 18 +++++++++++++----- source/player.h | 7 ++----- source/sections/game.cpp | 12 ++++-------- source/sections/game.h | 8 ++++---- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/source/player.cpp b/source/player.cpp index 1d80538..d7c232e 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -24,8 +24,8 @@ Player::Player(const Config &config) : player_sprite_(std::make_unique(config.texture.at(0), config.animations.at(0))), power_sprite_(std::make_unique(config.texture.at(4), config.animations.at(1))), enter_name_(std::make_unique()), - hi_score_table_(*config.hi_score_table), - glowing_entry_(*config.glowing_entry), + hi_score_table_(config.hi_score_table), + glowing_entry_(config.glowing_entry), play_area_(*config.play_area), id_(config.id), default_pos_x_(config.x), @@ -929,14 +929,22 @@ void Player::playSound(const std::string &name) const { // Indica si se puede dibujar el objeto auto Player::isRenderable() const -> bool { - //return !isGameOver() && !isTitleHidden(); + // return !isGameOver() && !isTitleHidden(); return !isTitleHidden(); }; // Añade una puntuación a la tabla de records void Player::addScoreToScoreBoard() const { + if (hi_score_table_ == nullptr) { + return; // Verificar esto antes de crear el manager + } + const auto ENTRY = HiScoreEntry(trim(getLastEnterName()), getScore(), get1CC()); - auto manager = std::make_unique(hi_score_table_); - glowing_entry_ = manager->add(ENTRY); + auto manager = std::make_unique(*hi_score_table_); + + if (glowing_entry_ != nullptr) { + *glowing_entry_ = manager->add(ENTRY); + } + manager->saveToFile(Asset::get()->get("score.bin")); } \ No newline at end of file diff --git a/source/player.h b/source/player.h index 958de9a..41e96ee 100644 --- a/source/player.h +++ b/source/player.h @@ -186,9 +186,6 @@ class Player { [[nodiscard]] auto getGamepad() const -> std::shared_ptr { return gamepad_; } void setUsesKeyboard(bool value) { uses_keyboard_ = value; } [[nodiscard]] auto getUsesKeyboard() const -> bool { return uses_keyboard_; } - void setHiScoreTable(const Table &table) { hi_score_table_ = table; } - [[nodiscard]] auto getHiScoreTable() const -> const Table & { return hi_score_table_; } - void setGlowingEntry(const int &entry) { glowing_entry_ = entry; } private: // --- Constantes --- @@ -204,8 +201,8 @@ class Player { std::unique_ptr power_sprite_; // Sprite para dibujar el aura del jugador con el poder a tope std::unique_ptr enter_name_; // Clase utilizada para introducir el nombre std::shared_ptr gamepad_ = nullptr; // Dispositivo asociado - Table &hi_score_table_; // Tabla de máximas puntuaciones - int &glowing_entry_; // Entrada de la tabla de puntuaciones para hacerla brillar + Table *hi_score_table_ = nullptr; // Tabla de máximas puntuaciones + int *glowing_entry_ = nullptr; // Entrada de la tabla de puntuaciones para hacerla brillar std::string name_; // Nombre del jugador std::string last_enter_name_; // Último nombre introducido en la tabla de puntuaciones diff --git a/source/sections/game.cpp b/source/sections/game.cpp index 6cbf723..3180cd7 100644 --- a/source/sections/game.cpp +++ b/source/sections/game.cpp @@ -1172,12 +1172,8 @@ void Game::updateScoreboard() { scoreboard_->update(); } -// Añade una puntuación a la tabla de records -void Game::addScoreToScoreBoard(const std::shared_ptr &player) { - const auto ENTRY = HiScoreEntry(trim(player->getLastEnterName()), player->getScore(), player->get1CC()); - auto manager = std::make_unique(Options::settings.hi_score_table); - Options::settings.glowing_entries.at(static_cast(player->getId()) - 1) = manager->add(ENTRY); - manager->saveToFile(Asset::get()->get("score.bin")); +// Pone en el marcador el nombre del primer jugador de la tabla +void Game::updateHiScoreName() { hi_score_.name = Options::settings.hi_score_table.front().name; } @@ -1443,8 +1439,8 @@ void Game::handleNameInput(const std::shared_ptr &player) { player->setPlayingState(Player::State::CONTINUE); } else if (player->getEnterNamePositionOverflow()) { player->setInput(Input::Action::START); - addScoreToScoreBoard(player); player->setPlayingState(Player::State::SHOWING_NAME); + updateHiScoreName(); } else { player->setInput(Input::Action::RIGHT); } @@ -1464,8 +1460,8 @@ void Game::handleNameInput(const std::shared_ptr &player) { player->setPlayingState(Player::State::CONTINUE); } else { player->setInput(Input::Action::START); - addScoreToScoreBoard(player); player->setPlayingState(Player::State::SHOWING_NAME); + updateHiScoreName(); } } } diff --git a/source/sections/game.h b/source/sections/game.h index d1d6964..acd156c 100644 --- a/source/sections/game.h +++ b/source/sections/game.h @@ -267,10 +267,10 @@ class Game { void evaluateAndSetMenace(); // Calcula y establece amenaza según globos activos // --- Puntuación y marcador --- - void updateHiScore(); // Actualiza el récord máximo si es necesario - void updateScoreboard(); // Actualiza la visualización del marcador - void addScoreToScoreBoard(const std::shared_ptr &player); // Añade puntuación del jugador al marcador - void initScoreboard(); // Inicializa el sistema de puntuación + void updateHiScore(); // Actualiza el récord máximo si es necesario + void updateScoreboard(); // Actualiza la visualización del marcador + void updateHiScoreName(); // Pone en el marcador el nombre del primer jugador de la tabla + void initScoreboard(); // Inicializa el sistema de puntuación // --- Modo demostración --- void initDemo(Player::Id player_id); // Inicializa variables para el modo demostración