Implementat el final del joc

This commit is contained in:
2024-11-01 13:05:11 +01:00
parent 2e0d27a95c
commit f786cb7776
8 changed files with 349 additions and 443 deletions

View File

@@ -39,9 +39,9 @@ void Player::init()
// Inicializa variables de estado
pos_x_ = default_pos_x_;
pos_y_ = default_pos_y_;
status_walking_ = PlayerStatus::WALKING_STOP;
status_firing_ = PlayerStatus::FIRING_NONE;
status_playing_ = PlayerStatus::WAITING;
walking_state_ = PlayerState::WALKING_STOP;
firing_state_ = PlayerState::FIRING_NONE;
playing_state_ = PlayerState::WAITING;
invulnerable_ = true;
invulnerable_counter_ = INVULNERABLE_COUNTER_;
power_up_ = false;
@@ -70,19 +70,15 @@ void Player::init()
// Actua en consecuencia de la entrada recibida
void Player::setInput(InputType input)
{
switch (status_playing_)
switch (playing_state_)
{
case PlayerStatus::PLAYING:
case PlayerState::PLAYING:
{
setInputPlaying(input);
break;
}
case PlayerStatus::ENTERING_NAME:
{
setInputEnteringName(input);
break;
}
case PlayerStatus::ENTERING_NAME_GAME_COMPLETED:
case PlayerState::ENTERING_NAME:
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
{
setInputEnteringName(input);
break;
@@ -100,34 +96,34 @@ void Player::setInputPlaying(InputType input)
case InputType::LEFT:
{
vel_x_ = -BASE_SPEED_;
setWalkingStatus(PlayerStatus::WALKING_LEFT);
setWalkingState(PlayerState::WALKING_LEFT);
break;
}
case InputType::RIGHT:
{
vel_x_ = BASE_SPEED_;
setWalkingStatus(PlayerStatus::WALKING_RIGHT);
setWalkingState(PlayerState::WALKING_RIGHT);
break;
}
case InputType::FIRE_CENTER:
{
setFiringStatus(PlayerStatus::FIRING_UP);
setFiringState(PlayerState::FIRING_UP);
break;
}
case InputType::FIRE_LEFT:
{
setFiringStatus(PlayerStatus::FIRING_LEFT);
setFiringState(PlayerState::FIRING_LEFT);
break;
}
case InputType::FIRE_RIGHT:
{
setFiringStatus(PlayerStatus::FIRING_RIGHT);
setFiringState(PlayerState::FIRING_RIGHT);
break;
}
default:
{
vel_x_ = 0;
setWalkingStatus(PlayerStatus::WALKING_STOP);
setWalkingState(PlayerState::WALKING_STOP);
break;
}
}
@@ -162,9 +158,9 @@ void Player::setInputEnteringName(InputType input)
// Mueve el jugador a la posición y animación que le corresponde
void Player::move()
{
switch (status_playing_)
switch (playing_state_)
{
case PlayerStatus::PLAYING:
case PlayerState::PLAYING:
{
// Mueve el jugador a derecha o izquierda
pos_x_ += vel_x_;
@@ -177,7 +173,7 @@ void Player::move()
shiftSprite();
break;
}
case PlayerStatus::DYING:
case PlayerState::DYING:
{
// 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))
@@ -185,10 +181,10 @@ void Player::move()
// Si el cadaver abandona el area de juego por abajo
if (player_sprite_->getPosY() > param.game.play_area.rect.h)
setStatusPlaying(PlayerStatus::DIED);
setPlayingState(PlayerState::DIED);
break;
}
case PlayerStatus::GAME_COMPLETED:
case PlayerState::GAME_COMPLETED:
{
switch (id_)
{
@@ -208,7 +204,7 @@ void Player::move()
shiftSprite();
if (pos_x_ == min_x || pos_x_ == max_x)
setStatusPlaying(PlayerStatus::GAME_OVER);
setPlayingState(PlayerState::GAME_OVER);
break;
}
default:
@@ -227,28 +223,22 @@ void Player::render()
player_sprite_->render();
}
// Establece el estado del jugador cuando camina
void Player::setWalkingStatus(PlayerStatus status) { status_walking_ = status; }
// Establece el estado del jugador cuando dispara
void Player::setFiringStatus(PlayerStatus status) { status_firing_ = status; }
// 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 = status_walking_ == PlayerStatus::WALKING_STOP ? "stand" : "walk";
const std::string a_firing = status_firing_ == PlayerStatus::FIRING_UP ? "centershoot" : "sideshoot";
const std::string a_cooling = status_firing_ == PlayerStatus::COOLING_UP ? "centershoot" : "sideshoot";
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 = status_walking_ == PlayerStatus::WALKING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_fire = status_firing_ == PlayerStatus::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
const SDL_RendererFlip flip_cooling = status_firing_ == PlayerStatus::COOLING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
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())
{
if (status_firing_ == PlayerStatus::FIRING_NONE)
if (firing_state_ == PlayerState::FIRING_NONE)
{ // No esta disparando
player_sprite_->setCurrentAnimation(a_walking);
player_sprite_->setFlip(flip_walk);
@@ -266,34 +256,20 @@ void Player::setAnimation()
player_sprite_->setFlip(a_firing == "centershoot" ? flip_walk : flip_fire);
}
}
else
else if (isDying() || hasDied())
{
player_sprite_->setCurrentAnimation("death");
}
else if (isCelebrating())
{
player_sprite_->setCurrentAnimation("celebration");
}
// Actualiza las animaciones de los sprites
player_sprite_->update(); // Hace avanzar las animaciones y mueve el cadaver del jugador
power_sprite_->update();
}
// Obtiene el valor de la variable
int Player::getPosX() const { return static_cast<int>(pos_x_); }
// Obtiene el valor de la variable
int Player::getPosY() const { return pos_y_; }
// Obtiene el valor de la variable
int Player::getWidth() const { return WIDTH_; }
// Obtiene el valor de la variable
int Player::getHeight() const { return HEIGHT_; }
// Indica si el jugador puede disparar
bool Player::canFire() const { return cooldown_ > 0 ? false : true; }
// Establece el valor de la variable
void Player::setFireCooldown(int time) { cooldown_ = time; }
// Actualiza el valor de la variable
void Player::updateCooldown()
{
@@ -306,16 +282,16 @@ void Player::updateCooldown()
if (!isCooling())
{
cooling_status_counter_ = 40;
switch (status_firing_)
switch (firing_state_)
{
case PlayerStatus::FIRING_LEFT:
status_firing_ = PlayerStatus::COOLING_LEFT;
case PlayerState::FIRING_LEFT:
firing_state_ = PlayerState::COOLING_LEFT;
break;
case PlayerStatus::FIRING_RIGHT:
status_firing_ = PlayerStatus::COOLING_RIGHT;
case PlayerState::FIRING_RIGHT:
firing_state_ = PlayerState::COOLING_RIGHT;
break;
case PlayerStatus::FIRING_UP:
status_firing_ = PlayerStatus::COOLING_UP;
case PlayerState::FIRING_UP:
firing_state_ = PlayerState::COOLING_UP;
break;
default:
break;
@@ -327,7 +303,7 @@ void Player::updateCooldown()
}
else
{
setFiringStatus(PlayerStatus::FIRING_NONE);
setFiringState(PlayerState::FIRING_NONE);
}
}
}
@@ -346,12 +322,6 @@ void Player::update()
updateScoreboard();
}
// Obtiene la puntuación del jugador
int Player::getScore() const { return score_; }
// Asigna un valor a la puntuación del jugador
void Player::setScore(int score) { score_ = score; }
// Incrementa la puntuación del jugador
void Player::addScore(int score)
{
@@ -361,50 +331,18 @@ void Player::addScore(int score)
}
}
// Indica si el jugador está jugando
bool Player::isPlaying() const { return status_playing_ == PlayerStatus::PLAYING; }
// Indica si el jugador está continuando
bool Player::isContinue() const { return status_playing_ == PlayerStatus::CONTINUE; }
// Indica si el jugador está esperando
bool Player::isWaiting() const { return status_playing_ == PlayerStatus::WAITING; }
// Indica si el jugador está introduciendo su nombre
bool Player::isEnteringName() const { return status_playing_ == PlayerStatus::ENTERING_NAME; }
// Indica si el jugador está muriendose
bool Player::isDying() const { return status_playing_ == PlayerStatus::DYING; }
// Indica si el jugador ha terminado de morir
bool Player::hasDied() const { return status_playing_ == PlayerStatus::DIED; }
// Indica si el jugador ya ha terminado de jugar
bool Player::isGameOver() const { return status_playing_ == PlayerStatus::GAME_OVER; }
// Indica si el jugador está introduciendo su nombre una vez ha completado el juego
bool Player::isEnteringNameGameCompleted() const { return status_playing_ == PlayerStatus::ENTERING_NAME_GAME_COMPLETED; }
// Indica si el jugador ha completado el juego
bool Player::isGameCompleted() const { return status_playing_ == PlayerStatus::GAME_COMPLETED; }
// Actualiza el panel del marcador
void Player::updateScoreboard()
{
switch (status_playing_)
switch (playing_state_)
{
case PlayerStatus::CONTINUE:
case PlayerState::CONTINUE:
{
Scoreboard::get()->setContinue(getScoreBoardPanel(), getContinueCounter());
break;
}
case PlayerStatus::ENTERING_NAME:
{
Scoreboard::get()->setRecordName(getScoreBoardPanel(), getRecordName());
Scoreboard::get()->setSelectorPos(getScoreBoardPanel(), getRecordNamePos());
break;
}
case PlayerStatus::ENTERING_NAME_GAME_COMPLETED:
case PlayerState::ENTERING_NAME:
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
{
Scoreboard::get()->setRecordName(getScoreBoardPanel(), getRecordName());
Scoreboard::get()->setSelectorPos(getScoreBoardPanel(), getRecordNamePos());
@@ -425,20 +363,20 @@ void Player::setScoreboardMode(ScoreboardMode mode)
}
// Establece el estado del jugador en el juego
void Player::setStatusPlaying(PlayerStatus value)
void Player::setPlayingState(PlayerState state)
{
status_playing_ = value;
playing_state_ = state;
switch (status_playing_)
switch (playing_state_)
{
case PlayerStatus::PLAYING:
case PlayerState::PLAYING:
{
init();
status_playing_ = PlayerStatus::PLAYING;
playing_state_ = PlayerState::PLAYING;
setScoreboardMode(ScoreboardMode::SCORE);
break;
}
case PlayerStatus::CONTINUE:
case PlayerState::CONTINUE:
{
// Inicializa el contador de continuar
continue_ticks_ = SDL_GetTicks();
@@ -447,17 +385,17 @@ void Player::setStatusPlaying(PlayerStatus value)
setScoreboardMode(ScoreboardMode::CONTINUE);
break;
}
case PlayerStatus::WAITING:
case PlayerState::WAITING:
{
setScoreboardMode(ScoreboardMode::WAITING);
break;
}
case PlayerStatus::ENTERING_NAME:
case PlayerState::ENTERING_NAME:
{
setScoreboardMode(ScoreboardMode::ENTER_NAME);
break;
}
case PlayerStatus::DYING:
case PlayerState::DYING:
{
// Activa la animación de morir
player_sprite_->setAccelY(0.2f);
@@ -465,27 +403,32 @@ void Player::setStatusPlaying(PlayerStatus value)
rand() % 2 == 0 ? player_sprite_->setVelX(3.3f) : player_sprite_->setVelX(-3.3f);
break;
}
case PlayerStatus::DIED:
case PlayerState::DIED:
{
const auto nextPlayerStatus = IsEligibleForHighScore() ? PlayerStatus::ENTERING_NAME : PlayerStatus::CONTINUE;
demo_ ? setStatusPlaying(PlayerStatus::WAITING) : setStatusPlaying(nextPlayerStatus);
const auto nextPlayerStatus = IsEligibleForHighScore() ? PlayerState::ENTERING_NAME : PlayerState::CONTINUE;
demo_ ? setPlayingState(PlayerState::WAITING) : setPlayingState(nextPlayerStatus);
break;
}
case PlayerStatus::GAME_OVER:
case PlayerState::GAME_OVER:
{
setScoreboardMode(ScoreboardMode::GAME_OVER);
break;
}
case PlayerStatus::ENTERING_NAME_GAME_COMPLETED:
case PlayerState::CELEBRATING:
{
setWalkingStatus(PlayerStatus::WALKING_STOP);
setFiringStatus(PlayerStatus::FIRING_NONE);
setScoreboardMode(ScoreboardMode::SCORE);
break;
}
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
{
setWalkingState(PlayerState::WALKING_STOP);
setFiringState(PlayerState::FIRING_NONE);
setScoreboardMode(ScoreboardMode::ENTER_NAME);
break;
}
case PlayerStatus::GAME_COMPLETED:
case PlayerState::GAME_COMPLETED:
{
setScoreboardMode(ScoreboardMode::GAME_OVER);
setScoreboardMode(ScoreboardMode::GAME_COMPLETED);
break;
}
default:
@@ -493,15 +436,6 @@ void Player::setStatusPlaying(PlayerStatus value)
}
}
// Obtiene el estado del jugador en el juego
PlayerStatus Player::getStatusPlaying() const { return status_playing_; }
// Obtiene el valor de la variable
float Player::getScoreMultiplier() const { return score_multiplier_; }
// Establece el valor de la variable
void Player::setScoreMultiplier(float value) { score_multiplier_ = value; }
// Aumenta el valor de la variable hasta un máximo
void Player::incScoreMultiplier()
{
@@ -516,9 +450,6 @@ void Player::decScoreMultiplier()
score_multiplier_ = std::max(score_multiplier_, 1.0f);
}
// Obtiene el valor de la variable
bool Player::isInvulnerable() const { return invulnerable_; }
// Establece el valor del estado
void Player::setInvulnerable(bool value)
{
@@ -526,12 +457,6 @@ void Player::setInvulnerable(bool value)
invulnerable_counter_ = invulnerable_ ? INVULNERABLE_COUNTER_ : 0;
}
// Obtiene el valor de la variable
int Player::getInvulnerableCounter() const { return invulnerable_counter_; }
// Establece el valor de la variable
void Player::setInvulnerableCounter(int value) { invulnerable_counter_ = value; }
// Monitoriza el estado
void Player::updateInvulnerable()
{
@@ -550,9 +475,6 @@ void Player::updateInvulnerable()
}
}
// Obtiene el valor de la variable
bool Player::isPowerUp() const { return power_up_; }
// Establece el valor de la variable
void Player::setPowerUp()
{
@@ -560,12 +482,6 @@ void Player::setPowerUp()
power_up_counter_ = POWERUP_COUNTER_;
}
// Obtiene el valor de la variable
int Player::getPowerUpCounter() const { return power_up_counter_; }
// Establece el valor de la variable
void Player::setPowerUpCounter(int value) { power_up_counter_ = value; }
// Actualiza el valor de la variable
void Player::updatePowerUp()
{
@@ -576,9 +492,6 @@ void Player::updatePowerUp()
}
}
// Obtiene el valor de la variable
bool Player::hasExtraHit() const { return extra_hit_; }
// Concede un toque extra al jugador
void Player::giveExtraHit()
{
@@ -603,12 +516,6 @@ void Player::removeExtraHit()
extra_hit_ = coffees_ == 0 ? false : true;
}
// Devuelve el número de cafes actuales
int Player::getCoffees() const { return coffees_; }
// Obtiene el circulo de colisión
Circle &Player::getCollider() { return collider_; }
// Actualiza el circulo de colisión a la posición del jugador
void Player::shiftColliders()
{
@@ -623,13 +530,10 @@ void Player::setPlayerTextures(const std::vector<std::shared_ptr<Texture>> &text
power_sprite_->setTexture(texture[1]);
}
// Obtiene el valor de la variable
int Player::getContinueCounter() const { return continue_counter_; }
// Actualiza el contador de continue
void Player::updateContinueCounter()
{
if (status_playing_ == PlayerStatus::CONTINUE)
if (playing_state_ == PlayerState::CONTINUE)
{
constexpr int TICKS_SPEED = 1000;
if (SDL_GetTicks() - continue_ticks_ > TICKS_SPEED)
@@ -642,7 +546,7 @@ void Player::updateContinueCounter()
// Actualiza el contador de entrar nombre
void Player::updateEnterNameCounter()
{
if (status_playing_ == PlayerStatus::ENTERING_NAME || status_playing_ == PlayerStatus::ENTERING_NAME_GAME_COMPLETED)
if (playing_state_ == PlayerState::ENTERING_NAME || playing_state_ == PlayerState::ENTERING_NAME_GAME_COMPLETED)
{
constexpr int TICKS_SPEED = 1000;
if (SDL_GetTicks() - enter_name_ticks_ > TICKS_SPEED)
@@ -652,12 +556,6 @@ void Player::updateEnterNameCounter()
}
}
// Le asigna un panel en el marcador al jugador
void Player::setScoreBoardPanel(int panel) { scoreboard_panel_ = panel; }
// Obtiene el valor de la variable
int Player::getScoreBoardPanel() const { return scoreboard_panel_; }
// Decrementa el contador de continuar
void Player::decContinueCounter()
{
@@ -665,7 +563,7 @@ void Player::decContinueCounter()
--continue_counter_;
if (continue_counter_ < 0)
{
setStatusPlaying(PlayerStatus::GAME_OVER);
setPlayingState(PlayerState::GAME_OVER);
}
}
@@ -677,23 +575,14 @@ void Player::decEnterNameCounter()
if (enter_name_counter_ < 0)
{
enter_name_counter_ = param.game.enter_name_seconds;
setStatusPlaying(PlayerStatus::CONTINUE);
if (playing_state_ == PlayerState::ENTERING_NAME)
setPlayingState(PlayerState::CONTINUE);
else
setPlayingState(PlayerState::GAME_COMPLETED);
}
}
// Establece el nombre del jugador
void Player::setName(const std::string &name) { name_ = name; }
// Establece el nombre del jugador para la tabla de mejores puntuaciones
void Player::setRecordName(const std::string &record_name) { record_name_ = record_name.substr(0, 8); }
// Obtiene el nombre del jugador
std::string Player::getName() const { return name_; }
// Obtiene el nombre del jugador para la tabla de mejores puntuaciones
std::string Player::getRecordName() const { return record_name_; }
// Obtiene la posici´´on que se está editando del nombre del jugador para la tabla de mejores puntuaciones
// Obtiene la posición que se está editando del nombre del jugador para la tabla de mejores puntuaciones
int Player::getRecordNamePos() const
{
if (enter_name_)
@@ -702,21 +591,6 @@ int Player::getRecordNamePos() const
return 0;
}
// Establece el mando que usará para ser controlado
void Player::setController(int index) { controller_index_ = index; }
// Obtiene el mando que usa para ser controlado
int Player::getController() const { return controller_index_; }
// Obtiene el "id" del jugador
int Player::getId() const { return id_; }
// Indica si el jugador se puede dibujar
bool Player::isRenderable() const { return isPlaying() || isDying() || isEnteringNameGameCompleted() || isGameCompleted(); }
// Comprueba si la puntuación entra en la tabla de mejores puntuaciones
bool Player::IsEligibleForHighScore() { return score_ > options.game.hi_score_table.back().score; }
// Recoloca los sprites
void Player::shiftSprite()
{
@@ -725,4 +599,48 @@ void Player::shiftSprite()
power_sprite_->setPosX(getPosX() - power_up_desp_x_);
}
bool Player::isCooling() { return status_firing_ == PlayerStatus::COOLING_LEFT || status_firing_ == PlayerStatus::COOLING_UP || status_firing_ == PlayerStatus::COOLING_RIGHT; }
int Player::getScore() const { return score_; }
void Player::setScore(int score) { score_ = score; }
PlayerState Player::getPlayingState() const { return playing_state_; }
float Player::getScoreMultiplier() const { return score_multiplier_; }
void Player::setScoreMultiplier(float value) { score_multiplier_ = value; }
bool Player::isInvulnerable() const { return invulnerable_; }
int Player::getInvulnerableCounter() const { return invulnerable_counter_; }
void Player::setInvulnerableCounter(int value) { invulnerable_counter_ = value; }
bool Player::isPowerUp() const { return power_up_; }
int Player::getPowerUpCounter() const { return power_up_counter_; }
void Player::setPowerUpCounter(int value) { power_up_counter_ = value; }
bool Player::hasExtraHit() const { return extra_hit_; }
void Player::setScoreBoardPanel(int panel) { scoreboard_panel_ = panel; }
int Player::getScoreBoardPanel() const { return scoreboard_panel_; }
int Player::getCoffees() const { return coffees_; }
Circle &Player::getCollider() { return collider_; }
int Player::getContinueCounter() const { return continue_counter_; }
void Player::setName(const std::string &name) { name_ = name; }
void Player::setRecordName(const std::string &record_name) { record_name_ = record_name.substr(0, 8); }
std::string Player::getName() const { return name_; }
std::string Player::getRecordName() const { return record_name_; }
void Player::setController(int index) { controller_index_ = index; }
int Player::getController() const { return controller_index_; }
int Player::getId() const { return id_; }
bool Player::isRenderable() const { return isPlaying() || isDying() || isCelebrating() || isEnteringNameGameCompleted() || isGameCompleted(); }
bool Player::IsEligibleForHighScore() { return score_ > options.game.hi_score_table.back().score; }
bool Player::isCooling() { return firing_state_ == PlayerState::COOLING_LEFT || firing_state_ == PlayerState::COOLING_UP || firing_state_ == PlayerState::COOLING_RIGHT; }
int Player::getPosX() const { return static_cast<int>(pos_x_); }
int Player::getPosY() const { return pos_y_; }
int Player::getWidth() const { return WIDTH_; }
int Player::getHeight() const { return HEIGHT_; }
bool Player::canFire() const { return cooldown_ > 0 ? false : true; }
void Player::setFireCooldown(int time) { cooldown_ = time; }
void Player::setWalkingState(PlayerState state) { walking_state_ = state; }
void Player::setFiringState(PlayerState state) { firing_state_ = state; }
bool Player::isPlaying() const { return playing_state_ == PlayerState::PLAYING; }
bool Player::isContinue() const { return playing_state_ == PlayerState::CONTINUE; }
bool Player::isWaiting() const { return playing_state_ == PlayerState::WAITING; }
bool Player::isEnteringName() const { return playing_state_ == PlayerState::ENTERING_NAME; }
bool Player::isDying() const { return playing_state_ == PlayerState::DYING; }
bool Player::hasDied() const { return playing_state_ == PlayerState::DIED; }
bool Player::isGameOver() const { return playing_state_ == PlayerState::GAME_OVER; }
bool Player::isEnteringNameGameCompleted() const { return playing_state_ == PlayerState::ENTERING_NAME_GAME_COMPLETED; }
bool Player::isGameCompleted() const { return playing_state_ == PlayerState::GAME_COMPLETED; }
bool Player::isCelebrating() const { return playing_state_ == PlayerState::CELEBRATING; }