Player: afegides animacions per al estat WAITING

Player: si tires a jugar desde el estat WAITING passes al ENTERING_SCREEN i despres sempre tens inmunitat, fins i tot la primera volta (al començar el joc)
falta: arregñar el z-order per al estat WAITING
This commit is contained in:
2025-07-25 20:54:00 +02:00
parent b165484e03
commit 03a7bbc6d1
17 changed files with 619 additions and 554 deletions

View File

@@ -237,9 +237,7 @@ void Game::updatePlayers() {
// Dibuja a los jugadores
void Game::renderPlayers() {
for (auto &player : players_) {
if (!player->isWaiting()) {
player->render();
}
player->render();
}
}
@@ -363,9 +361,9 @@ void Game::updateGameStateCompleted() {
for (auto &player : players_) {
if (player->isPlaying()) {
player->addScore(1000000);
player->setPlayingState(PlayerState::CELEBRATING);
player->setPlayingState(Player::State::CELEBRATING);
} else {
player->setPlayingState(PlayerState::GAME_OVER);
player->setPlayingState(Player::State::GAME_OVER);
}
}
@@ -376,14 +374,14 @@ void Game::updateGameStateCompleted() {
if (game_completed_counter_ == END_CELEBRATIONS) {
for (auto &player : players_) {
if (player->isCelebrating()) {
player->setPlayingState(player->isEligibleForHighScore() ? PlayerState::ENTERING_NAME_GAME_COMPLETED : PlayerState::LEAVING_SCREEN);
player->setPlayingState(player->isEligibleForHighScore() ? Player::State::ENTERING_NAME_GAME_COMPLETED : Player::State::LEAVING_SCREEN);
}
}
}
// Si los jugadores ya no estan y no quedan mensajes en pantalla
if (allPlayersAreGameOver() && path_sprites_.empty()) {
setState(GameState::GAME_OVER);
setState(State::GAME_OVER);
}
// Incrementa el contador al final
@@ -392,12 +390,12 @@ void Game::updateGameStateCompleted() {
// Comprueba el estado del juego
void Game::checkState() {
if (state_ != GameState::COMPLETED && Stage::number == 10) {
setState(GameState::COMPLETED);
if (state_ != State::COMPLETED && Stage::number == 10) {
setState(State::COMPLETED);
}
if (state_ != GameState::GAME_OVER && allPlayersAreGameOver()) {
setState(GameState::GAME_OVER);
if (state_ != State::GAME_OVER && allPlayersAreGameOver()) {
setState(State::GAME_OVER);
}
}
@@ -525,7 +523,7 @@ auto Game::checkBulletTabeCollision(std::shared_ptr<Bullet> bullet) -> bool {
return false;
}
tabe_->setState(TabeState::HIT);
tabe_->setState(Tabe::State::HIT);
bullet->disable();
handleTabeHitEffects();
@@ -859,7 +857,7 @@ void Game::handlePlayerCollision(std::shared_ptr<Player> &player, std::shared_pt
}
screen_->shake();
playSound("voice_no.wav");
player->setPlayingState(PlayerState::ROLLING);
player->setPlayingState(Player::State::ROLLING);
players_to_reorder_.push_back(player);
if (allPlayersAreNotPlaying()) {
Stage::power_can_be_added = false; // No se puede subir poder de fase si no hay nadie jugando
@@ -924,22 +922,22 @@ void Game::render() {
void Game::updateGameStates() {
if (!paused_) {
switch (state_) {
case GameState::FADE_IN:
case State::FADE_IN:
updateGameStateFadeIn();
break;
case GameState::ENTERING_PLAYER:
case State::ENTERING_PLAYER:
updateGameStateEnteringPlayer();
break;
case GameState::SHOWING_GET_READY_MESSAGE:
case State::SHOWING_GET_READY_MESSAGE:
updateGameStateShowingGetReadyMessage();
break;
case GameState::PLAYING:
case State::PLAYING:
updateGameStatePlaying();
break;
case GameState::COMPLETED:
case State::COMPLETED:
updateGameStateCompleted();
break;
case GameState::GAME_OVER:
case State::GAME_OVER:
updateGameStateGameOver();
break;
default:
@@ -951,7 +949,7 @@ void Game::updateGameStates() {
// Actualiza el fondo
void Game::updateBackground() {
// Si el juego está completado, se reduce la velocidad de las nubes
if (state_ == GameState::COMPLETED) {
if (state_ == State::COMPLETED) {
Stage::total_power = (Stage::total_power > 200) ? (Stage::total_power - 25) : 200;
}
@@ -1184,7 +1182,7 @@ void Game::addScoreToScoreBoard(const std::shared_ptr<Player> &player) {
// Saca del estado de GAME OVER al jugador si el otro está activo
void Game::checkAndUpdatePlayerStatus(int active_player_index, int inactive_player_index) {
if (players_[active_player_index]->isGameOver() && !players_[inactive_player_index]->isGameOver() && !players_[inactive_player_index]->isWaiting()) {
players_[active_player_index]->setPlayingState(PlayerState::WAITING);
players_[active_player_index]->setPlayingState(Player::State::WAITING);
}
}
@@ -1198,7 +1196,7 @@ void Game::checkPlayersStatusPlaying() {
if (allPlayersAreWaitingOrGameOver()) {
// Entonces los pone en estado de Game Over
for (auto &player : players_) {
player->setPlayingState(PlayerState::GAME_OVER);
player->setPlayingState(Player::State::GAME_OVER);
}
}
@@ -1415,7 +1413,11 @@ void Game::handleFireInputs(const std::shared_ptr<Player> &player, bool autofire
void Game::handlePlayerContinue(const std::shared_ptr<Player> &player) {
const auto CONTROLLER_INDEX = player->getController();
if (input_->checkInput(InputAction::START, INPUT_DO_NOT_ALLOW_REPEAT, Options::controllers[CONTROLLER_INDEX].type, Options::controllers[CONTROLLER_INDEX].index)) {
player->setPlayingState(PlayerState::RESPAWNING);
if (player->isContinue()) {
player->setPlayingState(Player::State::RESPAWNING);
} else if (player->isWaiting()) {
player->setPlayingState(Player::State::ENTERING_SCREEN);
}
}
// Disminuye el contador de continuación si se presiona cualquier botón de disparo.
@@ -1433,18 +1435,18 @@ void Game::handleNameInput(const std::shared_ptr<Player> &player) {
const auto CONTROLLER_INDEX = player->getController();
if (input_->checkInput(InputAction::FIRE_LEFT, INPUT_DO_NOT_ALLOW_REPEAT, Options::controllers[CONTROLLER_INDEX].type, Options::controllers[CONTROLLER_INDEX].index)) {
if (player->isShowingName()) {
player->setPlayingState(PlayerState::CONTINUE);
player->setPlayingState(Player::State::CONTINUE);
} else if (player->getEnterNamePositionOverflow()) {
player->setInput(InputAction::START);
addScoreToScoreBoard(player);
player->setPlayingState(PlayerState::SHOWING_NAME);
player->setPlayingState(Player::State::SHOWING_NAME);
} else {
player->setInput(InputAction::RIGHT);
}
} else if (input_->checkInput(InputAction::FIRE_CENTER, INPUT_DO_NOT_ALLOW_REPEAT, Options::controllers[CONTROLLER_INDEX].type, Options::controllers[CONTROLLER_INDEX].index) ||
input_->checkInput(InputAction::FIRE_RIGHT, INPUT_DO_NOT_ALLOW_REPEAT, Options::controllers[CONTROLLER_INDEX].type, Options::controllers[CONTROLLER_INDEX].index)) {
if (player->isShowingName()) {
player->setPlayingState(PlayerState::CONTINUE);
player->setPlayingState(Player::State::CONTINUE);
} else {
player->setInput(InputAction::LEFT);
}
@@ -1454,11 +1456,11 @@ void Game::handleNameInput(const std::shared_ptr<Player> &player) {
player->setInput(InputAction::DOWN);
} else if (input_->checkInput(InputAction::START, INPUT_DO_NOT_ALLOW_REPEAT, Options::controllers[CONTROLLER_INDEX].type, Options::controllers[CONTROLLER_INDEX].index)) {
if (player->isShowingName()) {
player->setPlayingState(PlayerState::CONTINUE);
player->setPlayingState(Player::State::CONTINUE);
} else {
player->setInput(InputAction::START);
addScoreToScoreBoard(player);
player->setPlayingState(PlayerState::SHOWING_NAME);
player->setPlayingState(Player::State::SHOWING_NAME);
}
}
}
@@ -1467,7 +1469,7 @@ void Game::handleNameInput(const std::shared_ptr<Player> &player) {
void Game::initDemo(int player_id) {
if (demo_.enabled) {
// Cambia el estado del juego
setState(GameState::PLAYING);
setState(State::PLAYING);
// Aleatoriza la asignación del fichero con los datos del modo demostracion
{
@@ -1494,7 +1496,7 @@ void Game::initDemo(int player_id) {
if (rand() % 3 != 0) {
const auto OTHER_PLAYER_ID = player_id == 1 ? 2 : 1;
auto other_player = getPlayer(OTHER_PLAYER_ID);
other_player->setPlayingState(PlayerState::PLAYING);
other_player->setPlayingState(Player::State::PLAYING);
}
// Asigna cafes a los jugadores
@@ -1507,8 +1509,8 @@ void Game::initDemo(int player_id) {
}
// Configura los marcadores
scoreboard_->setMode(SCOREBOARD_LEFT_PANEL, ScoreboardMode::DEMO);
scoreboard_->setMode(SCOREBOARD_RIGHT_PANEL, ScoreboardMode::DEMO);
scoreboard_->setMode(Scoreboard::Id::LEFT, Scoreboard::Mode::DEMO);
scoreboard_->setMode(Scoreboard::Id::RIGHT, Scoreboard::Mode::DEMO);
// Silencia los globos
balloon_manager_->setSounds(false);
@@ -1534,11 +1536,11 @@ void Game::setTotalPower() {
// Inicializa el marcador
void Game::initScoreboard() {
scoreboard_->setPos(param.scoreboard.rect);
scoreboard_->setMode(SCOREBOARD_CENTER_PANEL, ScoreboardMode::STAGE_INFO);
scoreboard_->setMode(Scoreboard::Id::CENTER, Scoreboard::Mode::STAGE_INFO);
for (const auto &player : players_) {
scoreboard_->setName(player->getScoreBoardPanel(), player->getName());
if (player->isWaiting()) {
scoreboard_->setMode(player->getScoreBoardPanel(), ScoreboardMode::WAITING);
scoreboard_->setMode(player->getScoreBoardPanel(), Scoreboard::Mode::WAITING);
}
}
}
@@ -1577,27 +1579,31 @@ void Game::initDifficultyVars() {
// Inicializa los jugadores
void Game::initPlayers(int player_id) {
// Crea los dos jugadores
constexpr int PLAYER_HEIGHT = 32;
constexpr int PLAYER_WIDTH = 32;
const int Y = param.game.play_area.rect.h - PLAYER_HEIGHT + 1;
// Crea al jugador uno y lo pone en modo espera
players_.emplace_back(std::make_unique<Player>(1, param.game.play_area.first_quarter_x - (PLAYER_WIDTH / 2), Y, demo_.enabled, param.game.play_area.rect, player_textures_[0], player_animations_));
players_.back()->setScoreBoardPanel(SCOREBOARD_LEFT_PANEL);
players_.back()->setScoreBoardPanel(Scoreboard::Id::LEFT);
players_.back()->setName(Lang::getText("[SCOREBOARD] 1"));
players_.back()->setController(getController(players_.back()->getId()));
players_.back()->setPlayingState(Player::State::WAITING);
// Crea al jugador dos y lo pone en modo espera
players_.emplace_back(std::make_unique<Player>(2, param.game.play_area.third_quarter_x - (PLAYER_WIDTH / 2), Y, demo_.enabled, param.game.play_area.rect, player_textures_[1], player_animations_));
players_.back()->setScoreBoardPanel(SCOREBOARD_RIGHT_PANEL);
players_.back()->setScoreBoardPanel(Scoreboard::Id::RIGHT);
players_.back()->setName(Lang::getText("[SCOREBOARD] 2"));
players_.back()->setController(getController(players_.back()->getId()));
players_.back()->setPlayingState(Player::State::WAITING);
// Activa el jugador que coincide con el "player_id" o ambos si es "0"
if (player_id == 0) {
// Activa ambos jugadores
getPlayer(1)->setPlayingState(demo_.enabled ? PlayerState::PLAYING : PlayerState::ENTERING_SCREEN);
getPlayer(2)->setPlayingState(demo_.enabled ? PlayerState::PLAYING : PlayerState::ENTERING_SCREEN);
getPlayer(1)->setPlayingState(demo_.enabled ? Player::State::PLAYING : Player::State::ENTERING_SCREEN);
getPlayer(2)->setPlayingState(demo_.enabled ? Player::State::PLAYING : Player::State::ENTERING_SCREEN);
} else {
getPlayer(player_id)->setPlayingState(demo_.enabled ? PlayerState::PLAYING : PlayerState::ENTERING_SCREEN);
getPlayer(player_id)->setPlayingState(demo_.enabled ? Player::State::PLAYING : Player::State::ENTERING_SCREEN);
}
}
@@ -1675,7 +1681,7 @@ void Game::updateGameStateFadeIn() {
updateScoreboard();
updateBackground();
if (fade_in_->hasEnded()) {
setState(GameState::ENTERING_PLAYER);
setState(State::ENTERING_PLAYER);
balloon_manager_->createTwoBigBalloons();
evaluateAndSetMenace();
}
@@ -1689,7 +1695,7 @@ void Game::updateGameStateEnteringPlayer() {
updateBackground();
for (const auto &player : players_) {
if (player->isPlaying()) {
setState(GameState::SHOWING_GET_READY_MESSAGE);
setState(State::SHOWING_GET_READY_MESSAGE);
createMessage({paths_.at(0), paths_.at(1)}, Resource::get()->getTexture("game_text_get_ready"));
playSound("voice_get_ready.wav");
}
@@ -1700,7 +1706,7 @@ void Game::updateGameStateEnteringPlayer() {
void Game::updateGameStateShowingGetReadyMessage() {
updateGameStatePlaying();
if (path_sprites_.empty()) {
setState(GameState::PLAYING);
setState(State::PLAYING);
}
if (counter_ == 100) {
playMusic();
@@ -1746,7 +1752,7 @@ void Game::cleanVectors() {
// Gestiona el nivel de amenaza
void Game::updateMenace() {
if (state_ == GameState::PLAYING) {
if (state_ == State::PLAYING) {
const auto STAGE = Stage::get(Stage::number);
const float PERCENT = Stage::power / STAGE.power_to_complete;
const int DIFFERENCE = STAGE.max_menace - STAGE.min_menace;
@@ -1787,7 +1793,7 @@ void Game::checkAndUpdateBalloonSpeed() {
}
// Cambia el estado del juego
void Game::setState(GameState state) {
void Game::setState(State state) {
state_ = state;
counter_ = 0;
}