Refet el spritesheet del jugador i el fitxer d'animacions

Afegits nous estats per al jugador: RECOIL
This commit is contained in:
2025-07-11 22:03:44 +02:00
parent 8f1511998c
commit 7ac46876ca
7 changed files with 194 additions and 90 deletions

View File

@@ -60,7 +60,7 @@ void Player::init()
vel_y_ = 0;
score_ = 0;
score_multiplier_ = 1.0f;
cool_down_ = 10;
cant_fire_counter_ = 10;
enter_name_->init(last_enter_name_);
// Establece la posición del sprite
@@ -358,41 +358,49 @@ void Player::setAnimation()
case PlayerState::CREDITS:
{
// Crea cadenas de texto para componer el nombre de la animación
const std::string WALKING_ANIMATION = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
const std::string FIRING_ANIMATION = firing_state_ == PlayerState::FIRING_UP ? "centershoot" : "sideshoot";
const std::string COOLING_ANIMATION = firing_state_ == PlayerState::COOLING_UP ? "centershoot" : "sideshoot";
const std::string WALK_ANIMATION = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
const std::string FIRE_ANIMATION = firing_state_ == PlayerState::FIRING_UP ? "-fire-center" : "-fire-side";
const std::string RECOIL_ANIMATION = firing_state_ == PlayerState::RECOILING_UP ? "-recoil-center" : "-recoil-side";
const std::string COOL_ANIMATION = firing_state_ == PlayerState::COOLING_UP ? "-cool-center" : "-cool-side";
const SDL_FlipMode FLIP_WALK = walking_state_ == PlayerState::WALKING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_FlipMode FLIP_FIRE = firing_state_ == PlayerState::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_FlipMode FLIP_COOLING = firing_state_ == PlayerState::COOLING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_FlipMode FLIP_RECOIL = firing_state_ == PlayerState::RECOILING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_FlipMode FLIP_COOL = 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(WALKING_ANIMATION);
player_sprite_->setCurrentAnimation(WALK_ANIMATION);
player_sprite_->setFlip(FLIP_WALK);
}
else if (isRecoiling())
{
// Retroceso
player_sprite_->setCurrentAnimation(WALK_ANIMATION + RECOIL_ANIMATION);
player_sprite_->setFlip(FLIP_RECOIL);
}
else if (isCooling())
{
// Acaba de disparar
player_sprite_->setCurrentAnimation(WALKING_ANIMATION + "-" + COOLING_ANIMATION + "-cooldown");
player_sprite_->setFlip(FLIP_COOLING);
player_sprite_->setCurrentAnimation(WALK_ANIMATION + COOL_ANIMATION);
player_sprite_->setFlip(FLIP_COOL);
}
else
{
// Está disparando
player_sprite_->setCurrentAnimation(WALKING_ANIMATION + "-" + FIRING_ANIMATION);
player_sprite_->setCurrentAnimation(WALK_ANIMATION + FIRE_ANIMATION);
// Si dispara de lado, invierte el sprite segun hacia donde dispara
// Si dispara recto, invierte el sprite segun hacia donde camina
player_sprite_->setFlip(FIRING_ANIMATION == "centershoot" ? FLIP_WALK : FLIP_FIRE);
player_sprite_->setFlip(FIRE_ANIMATION == "-fire-center" ? FLIP_WALK : FLIP_FIRE);
}
break;
}
case PlayerState::DYING:
case PlayerState::CONTINUE_TIME_OUT:
{
player_sprite_->setCurrentAnimation("dying");
player_sprite_->setCurrentAnimation("rolling");
break;
}
case PlayerState::LYING_ON_THE_FLOOR_FOREVER:
@@ -419,38 +427,64 @@ void Player::setAnimation()
// Actualiza el valor de la variable
void Player::updateCooldown()
{
if (cool_down_ > 0)
if (playing_state_ == PlayerState::PLAYING)
{
--cool_down_;
cooling_state_counter_ = 50;
}
else
{
if (cooling_state_counter_ > 0)
if (cant_fire_counter_ > 0)
{
if (cooling_state_counter_ == 40)
cooling_state_counter_ = COOLING_DURATION_;
// La mitad del tiempo que no puede disparar tiene el brazo arriba (PlayerState::FIRING)
// y la otra mitad en retroceso (PlayerState::RECOILING)
if (cant_fire_counter_ == recoiling_state_duration_ / 2)
{
switch (firing_state_)
{
case PlayerState::FIRING_LEFT:
setFiringState(PlayerState::COOLING_LEFT);
setFiringState(PlayerState::RECOILING_LEFT);
break;
case PlayerState::FIRING_RIGHT:
setFiringState(PlayerState::COOLING_RIGHT);
setFiringState(PlayerState::RECOILING_RIGHT);
break;
case PlayerState::FIRING_UP:
setFiringState(PlayerState::COOLING_UP);
setFiringState(PlayerState::RECOILING_UP);
break;
default:
break;
}
}
--cooling_state_counter_;
--cant_fire_counter_;
}
else
{
setFiringState(PlayerState::FIRING_NONE);
cooling_state_counter_ = 0;
if (cooling_state_counter_ > COOLING_COMPLETE_)
{
if (cooling_state_counter_ == COOLING_DURATION_)
{
switch (firing_state_)
{
case PlayerState::RECOILING_LEFT:
setFiringState(PlayerState::COOLING_LEFT);
break;
case PlayerState::RECOILING_RIGHT:
setFiringState(PlayerState::COOLING_RIGHT);
break;
case PlayerState::RECOILING_UP:
setFiringState(PlayerState::COOLING_UP);
break;
default:
break;
}
}
--cooling_state_counter_;
}
if (cooling_state_counter_ == COOLING_COMPLETE_)
{
setFiringState(PlayerState::FIRING_NONE);
cooling_state_counter_ = -1;
}
}
}
}
@@ -464,10 +498,10 @@ void Player::update()
updateCooldown();
updatePowerUp();
updateInvulnerable();
updateScoreboard();
updateContinueCounter();
updateEnterNameCounter();
updateShowingName();
updateScoreboard();
}
// Incrementa la puntuación del jugador
@@ -650,19 +684,20 @@ void Player::setInvulnerable(bool value)
// Monitoriza el estado
void Player::updateInvulnerable()
{
if (invulnerable_)
{
if (invulnerable_counter_ > 0)
if (playing_state_ == PlayerState::PLAYING)
if (invulnerable_)
{
--invulnerable_counter_;
invulnerable_counter_ % 8 > 3 ? player_sprite_->getTexture()->setPalette(coffees_) : player_sprite_->getTexture()->setPalette(3);
if (invulnerable_counter_ > 0)
{
--invulnerable_counter_;
invulnerable_counter_ % 8 > 3 ? player_sprite_->getTexture()->setPalette(coffees_) : player_sprite_->getTexture()->setPalette(3);
}
else
{
setInvulnerable(false);
player_sprite_->getTexture()->setPalette(coffees_);
}
}
else
{
setInvulnerable(false);
player_sprite_->getTexture()->setPalette(coffees_);
}
}
}
// Establece el valor de la variable
@@ -675,11 +710,12 @@ void Player::setPowerUp()
// Actualiza el valor de la variable
void Player::updatePowerUp()
{
if (power_up_)
{
--power_up_counter_;
power_up_ = power_up_counter_ > 0;
}
if (playing_state_ == PlayerState::PLAYING)
if (power_up_)
{
--power_up_counter_;
power_up_ = power_up_counter_ > 0;
}
}
// Concede un toque extra al jugador