Nova animació per a la mort del personatge

Nova lògica al morir
This commit is contained in:
2024-11-17 08:43:24 +01:00
parent da74b8dfce
commit 47e468034f
5 changed files with 77 additions and 34 deletions

View File

@@ -29,6 +29,7 @@ Player::Player(int id, float x, int y, bool demo, SDL_Rect &play_area, std::vect
power_sprite_->setPosY(y - (power_sprite_->getHeight() - player_sprite_->getHeight()));
// Inicializa variables
pos_x_ = default_pos_x_;
init();
}
@@ -36,7 +37,6 @@ Player::Player(int id, float x, int y, bool demo, SDL_Rect &play_area, std::vect
void Player::init()
{
// Inicializa variables de estado
pos_x_ = default_pos_x_;
pos_y_ = default_pos_y_;
walking_state_ = PlayerState::WALKING_STOP;
firing_state_ = PlayerState::FIRING_NONE;
@@ -175,14 +175,22 @@ void Player::move()
{
// Si el cadaver abandona el area de juego por los laterales lo hace rebotar
if ((player_sprite_->getPosX() < param.game.play_area.rect.x) || (player_sprite_->getPosX() + WIDTH_ > play_area_.w))
{
player_sprite_->setVelX(-player_sprite_->getVelX());
}
// Si el cadaver abandona el area de juego por abajo
if (player_sprite_->getPosY() > param.game.play_area.rect.h)
// Si el cadaver toca el suelo cambia el estado
if (player_sprite_->getPosY() > param.game.play_area.rect.h - HEIGHT_)
{
setPlayingState(PlayerState::DIED);
pos_x_ = player_sprite_->getPosX();
pos_y_ = default_pos_y_;
player_sprite_->clear();
shiftSprite();
}
break;
}
case PlayerState::GAME_COMPLETED:
case PlayerState::LEAVING_SCREEN:
{
switch (id_)
{
@@ -214,28 +222,38 @@ void Player::move()
void Player::render()
{
if (power_up_ && isPlaying())
{
if (power_up_counter_ > (POWERUP_COUNTER_ / 4) || power_up_counter_ % 20 > 4)
{
power_sprite_->render();
}
}
if (isRenderable())
{
player_sprite_->render();
}
}
// Establece la animación correspondiente al estado
void Player::setAnimation()
{
// Crea cadenas de texto para componer el nombre de la animación
const std::string a_walking = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
const std::string a_firing = firing_state_ == PlayerState::FIRING_UP ? "centershoot" : "sideshoot";
const std::string a_cooling = firing_state_ == PlayerState::COOLING_UP ? "centershoot" : "sideshoot";
const SDL_RendererFlip flip_walk = walking_state_ == PlayerState::WALKING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_fire = firing_state_ == PlayerState::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_cooling = firing_state_ == PlayerState::COOLING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
// Establece la animación a partir de las cadenas
if (isPlaying() || isEnteringNameGameCompleted() || isGameCompleted())
switch (playing_state_)
{
case PlayerState::PLAYING:
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
case PlayerState::LEAVING_SCREEN:
{
// Crea cadenas de texto para componer el nombre de la animación
const std::string a_walking = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
const std::string a_firing = firing_state_ == PlayerState::FIRING_UP ? "centershoot" : "sideshoot";
const std::string a_cooling = firing_state_ == PlayerState::COOLING_UP ? "centershoot" : "sideshoot";
const SDL_RendererFlip flip_walk = walking_state_ == PlayerState::WALKING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_fire = firing_state_ == PlayerState::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_cooling = firing_state_ == PlayerState::COOLING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
// Establece la animación a partir de las cadenas
if (firing_state_ == PlayerState::FIRING_NONE)
{ // No esta disparando
player_sprite_->setCurrentAnimation(a_walking);
@@ -253,14 +271,27 @@ void Player::setAnimation()
// Si dispara recto, invierte el sprite segun hacia donde camina
player_sprite_->setFlip(a_firing == "centershoot" ? flip_walk : flip_fire);
}
break;
}
else if (isDying() || hasDied())
case PlayerState::DYING:
{
player_sprite_->setCurrentAnimation("death");
player_sprite_->setCurrentAnimation("dying");
break;
}
else if (isCelebrating())
case PlayerState::DIED:
case PlayerState::ENTERING_NAME:
case PlayerState::CONTINUE:
{
player_sprite_->setCurrentAnimation("dead");
break;
}
case PlayerState::CELEBRATING:
{
player_sprite_->setCurrentAnimation("celebration");
break;
}
default:
break;
}
// Actualiza las animaciones de los sprites
@@ -423,7 +454,7 @@ void Player::setPlayingState(PlayerState state)
setScoreboardMode(ScoreboardMode::ENTER_NAME);
break;
}
case PlayerState::GAME_COMPLETED:
case PlayerState::LEAVING_SCREEN:
{
setScoreboardMode(ScoreboardMode::GAME_COMPLETED);
break;
@@ -575,7 +606,7 @@ void Player::decEnterNameCounter()
if (playing_state_ == PlayerState::ENTERING_NAME)
setPlayingState(PlayerState::CONTINUE);
else
setPlayingState(PlayerState::GAME_COMPLETED);
setPlayingState(PlayerState::LEAVING_SCREEN);
}
}