From 74f6fe35010d851556bab74215e7ced7c7fae863 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 24 Aug 2025 14:37:30 +0200 Subject: [PATCH] Afegit outline al text 2x corregit el marcador durant el Player::State::RECOVER --- config/assets.txt | 1 + data/font/04b_25_2x_white.png | Bin 0 -> 4273 bytes source/enter_name.cpp | 7 ++- source/player.cpp | 13 +++-- source/resource.cpp | 22 +++------ source/scoreboard.cpp | 88 +++++++++++++++++----------------- source/scoreboard.h | 3 +- source/sections/game.cpp | 12 ++--- 8 files changed, 72 insertions(+), 74 deletions(-) create mode 100644 data/font/04b_25_2x_white.png diff --git a/config/assets.txt b/config/assets.txt index b65507f..d6bd06a 100644 --- a/config/assets.txt +++ b/config/assets.txt @@ -175,6 +175,7 @@ BITMAP|${PREFIX}/data/gfx/player/hit.png # Fuentes de texto BITMAP|${PREFIX}/data/font/04b_25_2x.png +BITMAP|${PREFIX}/data/font/04b_25_2x_white.png BITMAP|${PREFIX}/data/font/04b_25_flat_2x.png BITMAP|${PREFIX}/data/font/04b_25_flat.png BITMAP|${PREFIX}/data/font/04b_25_grey.png diff --git a/data/font/04b_25_2x_white.png b/data/font/04b_25_2x_white.png new file mode 100644 index 0000000000000000000000000000000000000000..7003aeebbcfa282f908046178b8f81272b90d3a0 GIT binary patch literal 4273 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 0) // No es necesario verificar position_ < MAX_NAME_LENGTH { // Copiamos el índice del carácter anterior si es posible. - character_index_[position_] = character_index_[position_ - 1]; + //character_index_[position_] = character_index_[position_ - 1]; + + // Ponemos el caracter "espacio" + character_index_[position_] = 0; } else { // Si position_ es 0, inicializamos el carácter actual. character_index_[position_] = 0; @@ -149,7 +152,7 @@ auto EnterName::getRandomName() -> std::string { } // Obtiene el nombre final introducido auto EnterName::getFinalName() -> std::string { - auto name = trim(name_.substr(0, position_)); + auto name = trim(name_.substr(0, position_ + 1)); // Devuelve el texto intruducido incluyendo el del selector if (name.empty()) { name = getRandomName(); } diff --git a/source/player.cpp b/source/player.cpp index 13a7a77..bd1f0d5 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -624,6 +624,9 @@ void Player::setPlayingState(State state) { switch (playing_state_) { case State::RECOVER: { + score_ = 0; // Pon los puntos a cero para que no se vea en el marcador + score_multiplier_ = 1.0F; + setScoreboardMode(Scoreboard::Mode::SCORE); break; } case State::RESPAWNING: { @@ -781,19 +784,19 @@ void Player::updateInvulnerable() { if (playing_state_ == State::PLAYING && invulnerable_) { if (invulnerable_counter_ > 0) { --invulnerable_counter_; - + // Frecuencia fija de parpadeo (como el original) constexpr int blink_speed = 8; - + // Calcula proporción decreciente: menos textura blanca hacia el final // Al inicio: 50-50, hacia el final: 70-30 (menos blanco) float progress = 1.0f - (static_cast(invulnerable_counter_) / INVULNERABLE_COUNTER); - int white_frames = static_cast((0.5f - progress * 0.2f) * blink_speed); - + int white_frames = static_cast((0.5f - progress * 0.2f) * blink_speed); + // Alterna entre texturas con proporción variable bool should_show_invulnerable = (invulnerable_counter_ % blink_speed) < white_frames; size_t target_texture = should_show_invulnerable ? INVULNERABLE_TEXTURE : coffees_; - + // Solo cambia textura si es diferente (optimización) if (player_sprite_->getActiveTexture() != target_texture) { player_sprite_->setActiveTexture(target_texture); diff --git a/source/resource.cpp b/source/resource.cpp index 6e5dd65..ce725a2 100644 --- a/source/resource.cpp +++ b/source/resource.cpp @@ -661,7 +661,8 @@ void Resource::createTextTextures() { {"game_text_5000_points", "5.000"}, {"game_text_powerup", Lang::getText("[GAME_TEXT] 4")}, {"game_text_one_hit", Lang::getText("[GAME_TEXT] 5")}, - {"game_text_stop", Lang::getText("[GAME_TEXT] 6")}}; + {"game_text_stop", Lang::getText("[GAME_TEXT] 6")}, + {"game_text_1000000_points", Lang::getText("[GAME_TEXT] 8")}}; auto text1 = getText("04b_25_enhanced"); for (const auto &s : strings1) { @@ -669,27 +670,17 @@ void Resource::createTextTextures() { printWithDots("Texture : ", s.name, "[ DONE ]"); } - // Texturas de tamaño normal - std::vector strings2 = { - {"game_text_1000000_points", Lang::getText("[GAME_TEXT] 8")}}; - - auto text2 = getText("04b_25"); - for (const auto &s : strings2) { - textures_.emplace_back(s.name, text2->writeDXToTexture(Text::STROKE, s.text, -2, Colors::NO_COLOR_MOD, 1, param.game.item_text_outline_color)); - printWithDots("Texture : ", s.name, "[ DONE ]"); - } - // Texturas de tamaño doble - std::vector strings3 = { + std::vector strings2 = { {"game_text_100000_points", "100.000"}, {"game_text_get_ready", Lang::getText("[GAME_TEXT] 7")}, {"game_text_last_stage", Lang::getText("[GAME_TEXT] 3")}, {"game_text_congratulations", Lang::getText("[GAME_TEXT] 1")}, {"game_text_game_over", "Game Over"}}; - auto text3 = getText("04b_25_2x"); - for (const auto &s : strings3) { - textures_.emplace_back(s.name, text3->writeToTexture(s.text, 1, -4)); + auto text2 = getText("04b_25_2x_enhanced"); + for (const auto &s : strings2) { + textures_.emplace_back(s.name, text2->writeDXToTexture(Text::STROKE, s.text, -4, Colors::NO_COLOR_MOD, 1, param.game.item_text_outline_color)); printWithDots("Texture : ", s.name, "[ DONE ]"); } } @@ -713,6 +704,7 @@ void Resource::createText() { {"04b_25_enhanced", "04b_25.png", "04b_25.txt", "04b_25_white.png"}, // Nueva fuente con textura blanca {"04b_25_white", "04b_25_white.png", "04b_25.txt"}, {"04b_25_2x", "04b_25_2x.png", "04b_25_2x.txt"}, + {"04b_25_2x_enhanced", "04b_25_2x.png", "04b_25_2x.txt", "04b_25_2x_white.png"},// Nueva fuente con textura blanca {"04b_25_metal", "04b_25_metal.png", "04b_25.txt"}, {"04b_25_grey", "04b_25_grey.png", "04b_25.txt"}, {"04b_25_flat", "04b_25_flat.png", "04b_25.txt"}, diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index f07e80e..62b239f 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -37,7 +37,7 @@ auto Scoreboard::get() -> Scoreboard * { // Constructor Scoreboard::Scoreboard() - : renderer_(Screen::get()->getRenderer()), game_power_meter_texture_(Resource::get()->getTexture("game_power_meter.png")), power_meter_sprite_(std::make_unique(game_power_meter_texture_)), text_scoreboard_(Resource::get()->getText("8bithud")) { + : renderer_(Screen::get()->getRenderer()), game_power_meter_texture_(Resource::get()->getTexture("game_power_meter.png")), power_meter_sprite_(std::make_unique(game_power_meter_texture_)), text_(Resource::get()->getText("8bithud")), enter_name_text_(Resource::get()->getText("smb2")) { // Inicializa variables for (size_t i = 0; i < static_cast(Id::SIZE); ++i) { name_.at(i).clear(); @@ -195,50 +195,50 @@ void Scoreboard::renderPanelContent(size_t panel_index) { void Scoreboard::renderScoreMode(size_t panel_index) { // SCORE - text_scoreboard_->writeDX(Text::COLOR | Text::CENTER, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); - text_scoreboard_->writeDX(Text::COLOR | Text::CENTER, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::COLOR | Text::CENTER, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); + text_->writeDX(Text::COLOR | Text::CENTER, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); // MULT - text_scoreboard_->writeDX(Text::COLOR | Text::CENTER, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 3"), 1, text_color1_); - text_scoreboard_->writeDX(Text::COLOR | Text::CENTER, slot4_4_.x, slot4_4_.y, "x" + std::to_string(mult_.at(panel_index)).substr(0, 3), 1, text_color2_); + text_->writeDX(Text::COLOR | Text::CENTER, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 3"), 1, text_color1_); + text_->writeDX(Text::COLOR | Text::CENTER, slot4_4_.x, slot4_4_.y, "x" + std::to_string(mult_.at(panel_index)).substr(0, 3), 1, text_color2_); } void Scoreboard::renderDemoMode() { // DEMO MODE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 6"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 6"), 1, text_color1_); // PRESS START TO PLAY if (time_counter_ % 10 < 8) { - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 8"), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 9"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 8"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 9"), 1, text_color1_); } } void Scoreboard::renderWaitingMode() { // GAME OVER - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); // PRESS START TO PLAY if (time_counter_ % 10 < 8) { - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 8"), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 9"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 8"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 9"), 1, text_color1_); } } void Scoreboard::renderGameOverMode() { // GAME OVER - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); // PLEASE WAIT if (time_counter_ % 10 < 8) { - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 12"), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 13"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 12"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, Lang::getText("[SCOREBOARD] 13"), 1, text_color1_); } } void Scoreboard::renderStageInfoMode() { // STAGE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, Lang::getText("[SCOREBOARD] 5") + " " + std::to_string(stage_), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, Lang::getText("[SCOREBOARD] 5") + " " + std::to_string(stage_), 1, text_color1_); // POWERMETER power_meter_sprite_->setSpriteClip(0, 0, 40, 7); @@ -247,77 +247,75 @@ void Scoreboard::renderStageInfoMode() { power_meter_sprite_->render(); // HI-SCORE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 4"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 4"), 1, text_color1_); const std::string NAME = hi_score_name_.empty() ? "" : hi_score_name_ + " - "; - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, NAME + updateScoreText(hi_score_), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, NAME + updateScoreText(hi_score_), 1, text_color2_); } void Scoreboard::renderContinueMode(size_t panel_index) { // SCORE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); // CONTINUE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 10"), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, std::to_string(continue_counter_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 10"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, std::to_string(continue_counter_.at(panel_index)), 1, text_color2_); } void Scoreboard::renderEnterNameMode(size_t panel_index) { // SCORE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); // ENTER NAME - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); renderNameInputField(panel_index); } void Scoreboard::renderNameInputField(size_t panel_index) { - SDL_FRect rect = {enter_name_pos_.x, enter_name_pos_.y, 5.0F, 7.0F}; + SDL_FRect rect = { + .x = enter_name_pos_.x, + .y = enter_name_pos_.y, + .w = static_cast(enter_name_text_->getCharacterSize() - 2), + .h = static_cast(enter_name_text_->getCharacterSize())}; // Recorre todos los slots de letras del nombre for (size_t j = 0; j < NAME_SIZE; ++j) { - // Selecciona el color - const Color COLOR = j < selector_pos_.at(panel_index) ? text_color2_ : text_color1_; - // Dibuja la linea. Si coincide con el selector solo se dibuja 2 de cada 4 veces if (j != selector_pos_.at(panel_index) || time_counter_ % 4 >= 2) { - // Si está a la derecha del selector, se dibuja siempre - if (j >= selector_pos_.at(panel_index)) { - SDL_SetRenderDrawColor(renderer_, COLOR.r, COLOR.g, COLOR.b, 255); - SDL_RenderLine(renderer_, rect.x, rect.y + rect.h, rect.x + rect.w, rect.y + rect.h); - } + SDL_SetRenderDrawColor(renderer_, text_color1_.r, text_color1_.g, text_color1_.b, 255); + SDL_RenderLine(renderer_, rect.x, rect.y + rect.h, rect.x + rect.w, rect.y + rect.h); } - + // Dibuja la letra if (j < record_name_.at(panel_index).size()) { - text_scoreboard_->writeColored(rect.x, rect.y, record_name_.at(panel_index).substr(j, 1), COLOR); + enter_name_text_->writeColored(rect.x, rect.y, record_name_.at(panel_index).substr(j, 1), text_color2_); } - rect.x += 7; + rect.x += enter_name_text_->getCharacterSize(); } } void Scoreboard::renderShowNameMode(size_t panel_index) { // SCORE - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y, name_.at(panel_index), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_2_.x, slot4_2_.y, updateScoreText(score_.at(panel_index)), 1, text_color2_); // NAME - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y, Lang::getText("[SCOREBOARD] 11"), 1, text_color1_); - /* TEXTO CENTRADO */ - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, record_name_.at(panel_index), 1, Colors::getColorLikeKnightRider(name_colors_, loop_counter_ / 5)); + // NOMBRE INTRODUCIDO + enter_name_text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y, record_name_.at(panel_index), 1, Colors::getColorLikeKnightRider(name_colors_, loop_counter_ / 5)); } void Scoreboard::renderGameCompletedMode(size_t panel_index) { // GAME OVER - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_1_.x, slot4_1_.y + 4, Lang::getText("[SCOREBOARD] 7"), 1, text_color1_); // SCORE if (time_counter_ % 10 < 8) { - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 14"), 1, text_color1_); - text_scoreboard_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, updateScoreText(score_.at(panel_index)), 1, text_color2_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_3_.x, slot4_3_.y - 2, Lang::getText("[SCOREBOARD] 14"), 1, text_color1_); + text_->writeDX(Text::CENTER | Text::COLOR, slot4_4_.x, slot4_4_.y - 2, updateScoreText(score_.at(panel_index)), 1, text_color2_); } } @@ -377,7 +375,7 @@ void Scoreboard::recalculateAnchors() { slot4_4_ = {.x = COL, .y = ROW4}; // Primer cuadrado para poner el nombre de record - const int ENTER_NAME_LENGTH = text_scoreboard_->length(std::string(NAME_SIZE, 'A')); + const int ENTER_NAME_LENGTH = enter_name_text_->length(std::string(NAME_SIZE, 'A')); enter_name_pos_.x = COL - (ENTER_NAME_LENGTH / 2); enter_name_pos_.y = ROW4; diff --git a/source/scoreboard.h b/source/scoreboard.h index dbd6ff5..fb1f5cb 100644 --- a/source/scoreboard.h +++ b/source/scoreboard.h @@ -73,7 +73,8 @@ class Scoreboard { SDL_Renderer *renderer_; // El renderizador de la ventana std::shared_ptr game_power_meter_texture_; // Textura con el marcador de poder de la fase std::unique_ptr power_meter_sprite_; // Sprite para el medidor de poder de la fase - std::shared_ptr text_scoreboard_; // Fuente para el marcador del juego + std::shared_ptr text_; // Fuente para el marcador del juego + std::shared_ptr enter_name_text_; // Fuente para la introducción de nombre del jugador SDL_Texture *background_ = nullptr; // Textura para dibujar el marcador std::vector panel_texture_; // Texturas para dibujar cada panel diff --git a/source/sections/game.cpp b/source/sections/game.cpp index 0e515d1..07a05dc 100644 --- a/source/sections/game.cpp +++ b/source/sections/game.cpp @@ -285,11 +285,11 @@ void Game::updateStage() { if (current_stage_index == total_stages - 1) { // Penúltima fase (será la última) createMessage(paths, Resource::get()->getTexture("game_text_last_stage")); } else { - auto text = Resource::get()->getText("04b_25_2x"); + auto text = Resource::get()->getText("04b_25_2x_enhanced"); const std::string CAPTION = Lang::getText("[GAME_TEXT] 2") + std::to_string(total_stages - current_stage_index) + Lang::getText("[GAME_TEXT] 2A"); - createMessage(paths, text->writeToTexture(CAPTION, 1, -4)); + createMessage(paths, text->writeDXToTexture(Text::STROKE, CAPTION, -4, Colors::NO_COLOR_MOD, 1, param.game.item_text_outline_color)); } } @@ -1440,10 +1440,10 @@ void Game::handleNameInput(const std::shared_ptr &player) { } } else if (input_->checkAction(Input::Action::UP, Input::DO_NOT_ALLOW_REPEAT, player->getUsesKeyboard(), player->getGamepad())) { player->setInput(Input::Action::UP); - playSound("service_menu_move.wav"); - } else if (input_->checkAction(Input::Action::DOWN, Input::DO_NOT_ALLOW_REPEAT, player->getUsesKeyboard(), player->getGamepad())) { - player->setInput(Input::Action::DOWN); - playSound("service_menu_move.wav"); + playSound("service_menu_move.wav"); + } else if (input_->checkAction(Input::Action::DOWN, Input::DO_NOT_ALLOW_REPEAT, player->getUsesKeyboard(), player->getGamepad())) { + player->setInput(Input::Action::DOWN); + playSound("service_menu_move.wav"); } else if (input_->checkAction(Input::Action::START, Input::DO_NOT_ALLOW_REPEAT, player->getUsesKeyboard(), player->getGamepad())) { if (player->isShowingName()) { player->setPlayingState(Player::State::CONTINUE);