new: el jugador explota els globos per contacte si estos estan parats

This commit is contained in:
2025-07-14 14:08:08 +02:00
parent de560ee7e2
commit 3d26a3022c
5 changed files with 36 additions and 17 deletions

View File

@@ -45,10 +45,11 @@ public:
void update() override; // Actualiza la animación void update() override; // Actualiza la animación
// --- Control de animaciones --- // --- Control de animaciones ---
void setCurrentAnimation(const std::string &name = "default", bool reset = true); // Establece la animación por nombre void setCurrentAnimation(const std::string &name = "default", bool reset = true); // Establece la animación por nombre
void setCurrentAnimation(int index = 0, bool reset = true); // Establece la animación por índice void setCurrentAnimation(int index = 0, bool reset = true); // Establece la animación por índice
void resetAnimation(); // Reinicia la animación actual void resetAnimation(); // Reinicia la animación actual
void setAnimationSpeed(size_t value); // Establece la velocidad de la animación void setAnimationSpeed(size_t value); // Establece la velocidad de la animación
size_t getAnimationSpeed() const { return animations_[current_animation_].speed; } // Obtiene la velocidad de la animación actual
// --- Consultas --- // --- Consultas ---
bool animationIsCompleted(); // Comprueba si la animación ha terminado bool animationIsCompleted(); // Comprueba si la animación ha terminado

View File

@@ -195,7 +195,7 @@ void Player::move()
{ {
if (player_sprite_->getVelY() < 2.0f) if (player_sprite_->getVelY() < 2.0f)
{ {
// Si la velocidad de rebote es baja, termina de rebotar y cambia de estado // Si la velocidad de rebote es baja, lo detiene y cambia de estado
const auto nextPlayerStatus = IsEligibleForHighScore() ? PlayerState::ENTERING_NAME : PlayerState::CONTINUE; const auto nextPlayerStatus = IsEligibleForHighScore() ? PlayerState::ENTERING_NAME : PlayerState::CONTINUE;
demo_ ? setPlayingState(PlayerState::LYING_ON_THE_FLOOR_FOREVER) : setPlayingState(nextPlayerStatus); demo_ ? setPlayingState(PlayerState::LYING_ON_THE_FLOOR_FOREVER) : setPlayingState(nextPlayerStatus);
pos_x_ = player_sprite_->getPosX(); pos_x_ = player_sprite_->getPosX();
@@ -210,6 +210,7 @@ void Player::move()
player_sprite_->setPosY(play_area_.h - HEIGHT_); player_sprite_->setPosY(play_area_.h - HEIGHT_);
player_sprite_->setVelY(player_sprite_->getVelY() * -0.5f); player_sprite_->setVelY(player_sprite_->getVelY() * -0.5f);
player_sprite_->setVelX(player_sprite_->getVelX() * 0.75f); player_sprite_->setVelX(player_sprite_->getVelX() * 0.75f);
player_sprite_->setAnimationSpeed(player_sprite_->getAnimationSpeed() * 2);
playSound("jump.wav"); playSound("jump.wav");
} }
} }
@@ -627,6 +628,8 @@ void Player::setPlayingState(PlayerState state)
case PlayerState::ROLLING: case PlayerState::ROLLING:
{ {
// Activa la animación de rodar // Activa la animación de rodar
player_sprite_->setCurrentAnimation("rolling");
player_sprite_->setAnimationSpeed(4);
player_sprite_->setAccelY(0.2f); player_sprite_->setAccelY(0.2f);
player_sprite_->setVelY(-6.6f); player_sprite_->setVelY(-6.6f);
(rand() % 2 == 0) ? player_sprite_->setVelX(3.3f) : player_sprite_->setVelX(-3.3f); (rand() % 2 == 0) ? player_sprite_->setVelX(3.3f) : player_sprite_->setVelX(-3.3f);
@@ -635,6 +638,8 @@ void Player::setPlayingState(PlayerState state)
case PlayerState::TITLE_ANIMATION: case PlayerState::TITLE_ANIMATION:
{ {
// Activa la animación de rodar // Activa la animación de rodar
player_sprite_->setCurrentAnimation("rolling");
player_sprite_->setAnimationSpeed(5);
player_sprite_->setAccelY(0.2f); player_sprite_->setAccelY(0.2f);
player_sprite_->setVelY(-6.6f); player_sprite_->setVelY(-6.6f);
playSound("voice_thankyou.wav"); playSound("voice_thankyou.wav");

View File

@@ -210,14 +210,26 @@ void Game::updatePlayers()
if (player->isPlaying()) if (player->isPlaying())
{ {
// Comprueba la colisión entre el jugador y los globos // Comprueba la colisión entre el jugador y los globos
if (checkPlayerBalloonCollision(player)) auto balloon = checkPlayerBalloonCollision(player);
{
handlePlayerCollision(player);
if (demo_.enabled && allPlayersAreNotPlaying()) // Si hay colisión
if (balloon)
{
// Si el globo está parado y el temporizador activo, lo explota
if (balloon->isStopped() && time_stopped_counter_ > 0)
{ {
fade_out_->setType(FadeType::RANDOM_SQUARE); balloon_manager_->popBalloon(balloon);
fade_out_->activate(); }
// En caso contrario, el jugador ha sido golpeado por un globo activo
else
{
handlePlayerCollision(player);
if (demo_.enabled && allPlayersAreNotPlaying())
{
fade_out_->setType(FadeType::RANDOM_SQUARE);
fade_out_->activate();
}
} }
} }
@@ -443,20 +455,20 @@ void Game::destroyAllItems()
} }
// Comprueba la colisión entre el jugador y los globos activos // Comprueba la colisión entre el jugador y los globos activos
bool Game::checkPlayerBalloonCollision(std::shared_ptr<Player> &player) std::shared_ptr<Balloon> Game::checkPlayerBalloonCollision(std::shared_ptr<Player> &player)
{ {
for (auto &balloon : balloon_manager_->getBalloons()) for (auto &balloon : balloon_manager_->getBalloons())
{ {
if (!balloon->isStopped() && !balloon->isInvulnerable() && !balloon->isPowerBall()) if (!balloon->isInvulnerable() && !balloon->isPowerBall())
{ {
if (checkCollision(player->getCollider(), balloon->getCollider())) if (checkCollision(player->getCollider(), balloon->getCollider()))
{ {
return true; return balloon; // Devuelve el globo con el que se ha producido la colisión
} }
} }
} }
return false; return nullptr; // No se ha producido ninguna colisión
} }
// Comprueba la colisión entre el jugador y los items // Comprueba la colisión entre el jugador y los items

View File

@@ -14,6 +14,7 @@
class Audio; class Audio;
class Asset; class Asset;
class Background; class Background;
class Balloon;
class BalloonManager; class BalloonManager;
class Tabe; class Tabe;
class Bullet; class Bullet;
@@ -174,7 +175,7 @@ private:
void updateStage(); // Comprueba si hay cambio de fase y actualiza las variables void updateStage(); // Comprueba si hay cambio de fase y actualiza las variables
void updateGameStateGameOver(); // Actualiza el estado de fin de la partida void updateGameStateGameOver(); // Actualiza el estado de fin de la partida
void destroyAllItems(); // Destruye todos los items void destroyAllItems(); // Destruye todos los items
bool checkPlayerBalloonCollision(std::shared_ptr<Player> &player); // Comprueba la colisión entre el jugador y los globos activos std::shared_ptr<Balloon> checkPlayerBalloonCollision(std::shared_ptr<Player> &player); // Comprueba la colisión entre el jugador y los globos activos
void checkPlayerItemCollision(std::shared_ptr<Player> &player); // Comprueba la colisión entre el jugador y los items void checkPlayerItemCollision(std::shared_ptr<Player> &player); // Comprueba la colisión entre el jugador y los items
void checkBulletCollision(); // Comprueba y procesa la colisión de las balas void checkBulletCollision(); // Comprueba y procesa la colisión de las balas
void updateBullets(); // Mueve las balas activas void updateBullets(); // Mueve las balas activas