Treballant en el final del joc

This commit is contained in:
2024-10-31 11:58:01 +01:00
parent 7e2691e33e
commit 30dfa4c545
7 changed files with 502 additions and 656 deletions

View File

@@ -61,8 +61,7 @@ void Player::init()
// Establece la posición del sprite
player_sprite_->clear();
player_sprite_->setPosX(pos_x_);
player_sprite_->setPosY(pos_y_);
shiftSprite();
// Selecciona un frame para pintar
player_sprite_->setCurrentAnimation("stand");
@@ -78,13 +77,16 @@ void Player::setInput(InputType input)
setInputPlaying(input);
break;
}
case PlayerStatus::ENTERING_NAME:
{
setInputEnteringName(input);
break;
}
case PlayerStatus::ENTERING_NAME_GAME_COMPLETED:
{
setInputEnteringName(input);
break;
}
default:
break;
}
@@ -101,32 +103,27 @@ void Player::setInputPlaying(InputType input)
setWalkingStatus(PlayerStatus::WALKING_LEFT);
break;
}
case InputType::RIGHT:
{
vel_x_ = BASE_SPEED_;
setWalkingStatus(PlayerStatus::WALKING_RIGHT);
break;
}
case InputType::FIRE_CENTER:
{
setFiringStatus(PlayerStatus::FIRING_UP);
break;
}
case InputType::FIRE_LEFT:
{
setFiringStatus(PlayerStatus::FIRING_LEFT);
break;
}
case InputType::FIRE_RIGHT:
{
setFiringStatus(PlayerStatus::FIRING_RIGHT);
break;
}
default:
{
vel_x_ = 0;
@@ -144,23 +141,18 @@ void Player::setInputEnteringName(InputType input)
case InputType::LEFT:
enter_name_->decPosition();
break;
case InputType::RIGHT:
enter_name_->incPosition();
break;
case InputType::UP:
enter_name_->incIndex();
break;
case InputType::DOWN:
enter_name_->decIndex();
break;
case InputType::START:
setRecordName(enter_name_->getName());
break;
default:
break;
}
@@ -170,7 +162,9 @@ void Player::setInputEnteringName(InputType input)
// Mueve el jugador a la posición y animación que le corresponde
void Player::move()
{
if (isPlaying())
switch (status_playing_)
{
case PlayerStatus::PLAYING:
{
// Mueve el jugador a derecha o izquierda
pos_x_ += vel_x_;
@@ -178,16 +172,12 @@ void Player::move()
// Si el jugador abandona el area de juego por los laterales, restaura su posición
const float min_x = param.game.play_area.rect.x - 5;
const float max_x = play_area_.w + 5 - WIDTH_;
if ((pos_x_ < min_x) || (pos_x_ > max_x))
pos_x_ = std::clamp(pos_x_, min_x, max_x);
pos_x_ = std::clamp(pos_x_, min_x, max_x);
// Actualiza la posición del sprite
player_sprite_->setPosX(pos_x_);
player_sprite_->setPosY(pos_y_);
power_sprite_->setPosX(getPosX() - power_up_desp_x_);
shiftSprite();
break;
}
else if (isDying())
case PlayerStatus::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))
@@ -196,6 +186,33 @@ 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);
break;
}
case PlayerStatus::GAME_COMPLETED:
{
switch (id_)
{
case 1:
setInputPlaying(InputType::LEFT);
break;
case 2:
setInputPlaying(InputType::RIGHT);
break;
default:
break;
}
pos_x_ += vel_x_;
const float min_x = -WIDTH_;
const float max_x = play_area_.w;
pos_x_ = std::clamp(pos_x_, min_x, max_x);
shiftSprite();
if (pos_x_ == min_x || pos_x_ == max_x)
setStatusPlaying(PlayerStatus::GAME_OVER);
break;
}
default:
break;
}
}
@@ -211,16 +228,10 @@ void Player::render()
}
// Establece el estado del jugador cuando camina
void Player::setWalkingStatus(PlayerStatus status)
{
status_walking_ = status;
}
void Player::setWalkingStatus(PlayerStatus status) { status_walking_ = status; }
// Establece el estado del jugador cuando dispara
void Player::setFiringStatus(PlayerStatus status)
{
status_firing_ = status;
}
void Player::setFiringStatus(PlayerStatus status) { status_firing_ = status; }
// Establece la animación correspondiente al estado
void Player::setAnimation()
@@ -233,7 +244,7 @@ void Player::setAnimation()
const SDL_RendererFlip flip_fire = status_firing_ == PlayerStatus::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
// Establece la animación a partir de las cadenas
if (isPlaying())
if (isPlaying() || isEnteringNameGameCompleted() || isGameCompleted())
{
if (status_firing_ == PlayerStatus::FIRING_NONE)
{ // No esta disparando
@@ -259,41 +270,22 @@ void Player::setAnimation()
}
// Obtiene el valor de la variable
int Player::getPosX() const
{
return static_cast<int>(pos_x_);
}
int Player::getPosX() const { return static_cast<int>(pos_x_); }
// Obtiene el valor de la variable
int Player::getPosY() const
{
return pos_y_;
}
int Player::getPosY() const { return pos_y_; }
// Obtiene el valor de la variable
int Player::getWidth() const
{
return WIDTH_;
}
int Player::getWidth() const { return WIDTH_; }
// Obtiene el valor de la variable
int Player::getHeight() const
{
return HEIGHT_;
}
int Player::getHeight() const { return HEIGHT_; }
// Indica si el jugador puede disparar
bool Player::canFire() const
{
// Si el contador a llegado a cero, podemos disparar. En caso contrario decrementamos el contador
return cooldown_ > 0 ? false : true;
}
bool Player::canFire() const { return cooldown_ > 0 ? false : true; }
// Establece el valor de la variable
void Player::setFireCooldown(int time)
{
cooldown_ = time;
}
void Player::setFireCooldown(int time) { cooldown_ = time; }
// Actualiza el valor de la variable
void Player::updateCooldown()
@@ -327,16 +319,10 @@ void Player::update()
}
// Obtiene la puntuación del jugador
int Player::getScore() const
{
return score_;
}
int Player::getScore() const { return score_; }
// Asigna un valor a la puntuación del jugador
void Player::setScore(int score)
{
score_ = score;
}
void Player::setScore(int score) { score_ = score; }
// Incrementa la puntuación del jugador
void Player::addScore(int score)
@@ -348,66 +334,54 @@ void Player::addScore(int score)
}
// Indica si el jugador está jugando
bool Player::isPlaying() const
{
return status_playing_ == PlayerStatus::PLAYING;
}
bool Player::isPlaying() const { return status_playing_ == PlayerStatus::PLAYING; }
// Indica si el jugador está continuando
bool Player::isContinue() const
{
return status_playing_ == PlayerStatus::CONTINUE;
}
bool Player::isContinue() const { return status_playing_ == PlayerStatus::CONTINUE; }
// Indica si el jugador está esperando
bool Player::isWaiting() const
{
return status_playing_ == PlayerStatus::WAITING;
}
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;
}
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;
}
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;
}
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;
}
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_)
{
case PlayerStatus::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:
{
Scoreboard::get()->setRecordName(getScoreBoardPanel(), getRecordName());
Scoreboard::get()->setSelectorPos(getScoreBoardPanel(), getRecordNamePos());
break;
}
default:
break;
}
@@ -436,7 +410,6 @@ void Player::setStatusPlaying(PlayerStatus value)
setScoreboardMode(ScoreboardMode::SCORE);
break;
}
case PlayerStatus::CONTINUE:
{
// Inicializa el contador de continuar
@@ -446,19 +419,16 @@ void Player::setStatusPlaying(PlayerStatus value)
setScoreboardMode(ScoreboardMode::CONTINUE);
break;
}
case PlayerStatus::WAITING:
{
setScoreboardMode(ScoreboardMode::WAITING);
break;
}
case PlayerStatus::ENTERING_NAME:
{
setScoreboardMode(ScoreboardMode::ENTER_NAME);
break;
}
case PlayerStatus::DYING:
{
// Activa la animación de morir
@@ -467,42 +437,42 @@ void Player::setStatusPlaying(PlayerStatus value)
rand() % 2 == 0 ? player_sprite_->setVelX(3.3f) : player_sprite_->setVelX(-3.3f);
break;
}
case PlayerStatus::DIED:
{
const auto nextPlayerStatus = IsEligibleForHighScore() ? PlayerStatus::ENTERING_NAME : PlayerStatus::CONTINUE;
demo_ ? setStatusPlaying(PlayerStatus::WAITING) : setStatusPlaying(nextPlayerStatus);
break;
}
case PlayerStatus::GAME_OVER:
{
setScoreboardMode(ScoreboardMode::GAME_OVER);
break;
}
case PlayerStatus::ENTERING_NAME_GAME_COMPLETED:
{
setWalkingStatus(PlayerStatus::WALKING_STOP);
setFiringStatus(PlayerStatus::FIRING_NONE);
setScoreboardMode(ScoreboardMode::ENTER_NAME);
break;
}
case PlayerStatus::GAME_COMPLETED:
{
setScoreboardMode(ScoreboardMode::GAME_OVER);
break;
}
default:
break;
}
}
// Obtiene el estado del jugador en el juego
PlayerStatus Player::getStatusPlaying() const
{
return status_playing_;
}
PlayerStatus Player::getStatusPlaying() const { return status_playing_; }
// Obtiene el valor de la variable
float Player::getScoreMultiplier() const
{
return score_multiplier_;
}
float Player::getScoreMultiplier() const { return score_multiplier_; }
// Establece el valor de la variable
void Player::setScoreMultiplier(float value)
{
score_multiplier_ = value;
}
void Player::setScoreMultiplier(float value) { score_multiplier_ = value; }
// Aumenta el valor de la variable hasta un máximo
void Player::incScoreMultiplier()
@@ -519,10 +489,7 @@ void Player::decScoreMultiplier()
}
// Obtiene el valor de la variable
bool Player::isInvulnerable() const
{
return invulnerable_;
}
bool Player::isInvulnerable() const { return invulnerable_; }
// Establece el valor del estado
void Player::setInvulnerable(bool value)
@@ -532,16 +499,10 @@ void Player::setInvulnerable(bool value)
}
// Obtiene el valor de la variable
int Player::getInvulnerableCounter() const
{
return invulnerable_counter_;
}
int Player::getInvulnerableCounter() const { return invulnerable_counter_; }
// Establece el valor de la variable
void Player::setInvulnerableCounter(int value)
{
invulnerable_counter_ = value;
}
void Player::setInvulnerableCounter(int value) { invulnerable_counter_ = value; }
// Monitoriza el estado
void Player::updateInvulnerable()
@@ -562,10 +523,7 @@ void Player::updateInvulnerable()
}
// Obtiene el valor de la variable
bool Player::isPowerUp() const
{
return power_up_;
}
bool Player::isPowerUp() const { return power_up_; }
// Establece el valor de la variable
void Player::setPowerUp()
@@ -575,16 +533,10 @@ void Player::setPowerUp()
}
// Obtiene el valor de la variable
int Player::getPowerUpCounter() const
{
return power_up_counter_;
}
int Player::getPowerUpCounter() const { return power_up_counter_; }
// Establece el valor de la variable
void Player::setPowerUpCounter(int value)
{
power_up_counter_ = value;
}
void Player::setPowerUpCounter(int value) { power_up_counter_ = value; }
// Actualiza el valor de la variable
void Player::updatePowerUp()
@@ -597,10 +549,7 @@ void Player::updatePowerUp()
}
// Obtiene el valor de la variable
bool Player::hasExtraHit() const
{
return extra_hit_;
}
bool Player::hasExtraHit() const { return extra_hit_; }
// Concede un toque extra al jugador
void Player::giveExtraHit()
@@ -627,16 +576,10 @@ void Player::removeExtraHit()
}
// Devuelve el número de cafes actuales
int Player::getCoffees() const
{
return coffees_;
}
int Player::getCoffees() const { return coffees_; }
// Obtiene el circulo de colisión
Circle &Player::getCollider()
{
return collider_;
}
Circle &Player::getCollider() { return collider_; }
// Actualiza el circulo de colisión a la posición del jugador
void Player::shiftColliders()
@@ -653,10 +596,7 @@ void Player::setPlayerTextures(const std::vector<std::shared_ptr<Texture>> &text
}
// Obtiene el valor de la variable
int Player::getContinueCounter() const
{
return continue_counter_;
}
int Player::getContinueCounter() const { return continue_counter_; }
// Actualiza el contador de continue
void Player::updateContinueCounter()
@@ -674,7 +614,7 @@ void Player::updateContinueCounter()
// Actualiza el contador de entrar nombre
void Player::updateEnterNameCounter()
{
if (status_playing_ == PlayerStatus::ENTERING_NAME)
if (status_playing_ == PlayerStatus::ENTERING_NAME || status_playing_ == PlayerStatus::ENTERING_NAME_GAME_COMPLETED)
{
constexpr int TICKS_SPEED = 1000;
if (SDL_GetTicks() - enter_name_ticks_ > TICKS_SPEED)
@@ -685,16 +625,10 @@ void Player::updateEnterNameCounter()
}
// Le asigna un panel en el marcador al jugador
void Player::setScoreBoardPanel(int panel)
{
scoreboard_panel_ = panel;
}
void Player::setScoreBoardPanel(int panel) { scoreboard_panel_ = panel; }
// Obtiene el valor de la variable
int Player::getScoreBoardPanel() const
{
return scoreboard_panel_;
}
int Player::getScoreBoardPanel() const { return scoreboard_panel_; }
// Decrementa el contador de continuar
void Player::decContinueCounter()
@@ -720,66 +654,45 @@ void Player::decEnterNameCounter()
}
// Establece el nombre del jugador
void Player::setName(const std::string &name)
{
name_ = name;
}
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);
}
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_;
}
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_;
}
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
int Player::getRecordNamePos() const
{
if (enter_name_)
{
return enter_name_->getPosition();
}
return 0;
}
// Establece el mando que usará para ser controlado
void Player::setController(int index)
{
controller_index_ = index;
}
void Player::setController(int index) { controller_index_ = index; }
// Obtiene el mando que usa para ser controlado
int Player::getController() const
{
return controller_index_;
}
int Player::getController() const { return controller_index_; }
// Obtiene el "id" del jugador
int Player::getId() const
{
return id_;
}
int Player::getId() const { return id_; }
// Indica si el jugador se puede dibujar
bool Player::isRenderable() const
{
return isPlaying() || isDying();
}
bool Player::isRenderable() const { return isPlaying() || isDying() || isEnteringNameGameCompleted() || isGameCompleted(); }
// Comprueba si la puntuación entra en la tabla de mejores puntuaciones
bool Player::IsEligibleForHighScore()
bool Player::IsEligibleForHighScore() { return score_ > options.game.hi_score_table.back().score; }
// Recoloca los sprites
void Player::shiftSprite()
{
return score_ > options.game.hi_score_table.back().score;
player_sprite_->setPosX(pos_x_);
player_sprite_->setPosY(pos_y_);
power_sprite_->setPosX(getPosX() - power_up_desp_x_);
}