new: ja es pot començar el joc els dos jugador a l'hora

new: feedback visual per a saber qui ha pulsat start en la pantalla de titol
Player: afegit estat RESPAWNING per no tindre que estar fent cabrioles amb la invulnerabilitat al crear als jugadors
This commit is contained in:
2025-07-14 11:41:12 +02:00
parent e14336bad9
commit 31910b8a74
9 changed files with 309 additions and 112 deletions

View File

@@ -33,6 +33,8 @@ Player::Player(int id, float x, int y, bool demo, SDL_FRect &play_area, std::vec
// Inicializa variables
pos_x_ = default_pos_x_;
invulnerable_ = false;
invulnerable_counter_ = 0;
init();
}
@@ -44,8 +46,6 @@ void Player::init()
walking_state_ = PlayerState::WALKING_STOP;
firing_state_ = PlayerState::FIRING_NONE;
playing_state_ = PlayerState::WAITING;
invulnerable_ = true;
invulnerable_counter_ = INVULNERABLE_COUNTER_;
power_up_ = false;
power_up_counter_ = POWERUP_COUNTER_;
extra_hit_ = false;
@@ -177,9 +177,9 @@ void Player::move()
shiftSprite();
break;
}
case PlayerState::DYING:
case PlayerState::ROLLING:
{
// Si el cadaver abandona el area de juego por los laterales lo hace rebotar
// Si el jugador abandona el area de juego por los laterales lo hace rebotar
const int X = player_sprite_->getPosX();
const int MIN_X = play_area_.x;
const int MAX_X = play_area_.x + play_area_.w - WIDTH_;
@@ -190,7 +190,7 @@ void Player::move()
playSound("jump.wav");
}
// Si el cadaver toca el suelo rebota y si tiene poca velocidad, se detiene y cambia de estado
// Si el jugador toca el suelo rebota y si tiene poca velocidad, se detiene y cambia de estado
if (player_sprite_->getPosY() > play_area_.h - HEIGHT_)
{
if (player_sprite_->getVelY() < 2.0f)
@@ -215,6 +215,24 @@ void Player::move()
}
break;
}
case PlayerState::TITLE_ANIMATION:
{
// Si el jugador abandona el area de juego por los laterales lo detiene
const int X = player_sprite_->getPosX();
const int MIN_X = play_area_.x - WIDTH_;
const int MAX_X = play_area_.x + play_area_.w;
if ((X < MIN_X) || (X > MAX_X))
{
setPlayingState(PlayerState::TITLE_HIDDEN);
}
// Si el jugador toca el suelo rebota lo detiene
if (player_sprite_->getPosY() > play_area_.h)
{
setPlayingState(PlayerState::TITLE_HIDDEN);
}
break;
}
case PlayerState::CONTINUE_TIME_OUT:
{
// Si el cadaver desaparece por el suelo, cambia de estado
@@ -397,8 +415,9 @@ void Player::setAnimation()
}
break;
}
case PlayerState::DYING:
case PlayerState::ROLLING:
case PlayerState::CONTINUE_TIME_OUT:
case PlayerState::TITLE_ANIMATION:
{
player_sprite_->setCurrentAnimation("rolling");
break;
@@ -562,6 +581,13 @@ void Player::setPlayingState(PlayerState state)
switch (playing_state_)
{
case PlayerState::RESPAWNING:
{
setInvulnerable(true);
addCredit();
playSound("voice_thankyou.wav");
setPlayingState(PlayerState::PLAYING);
}
case PlayerState::PLAYING:
{
init();
@@ -597,14 +623,28 @@ void Player::setPlayingState(PlayerState state)
addScoreToScoreBoard();
break;
}
case PlayerState::DYING:
case PlayerState::ROLLING:
{
// Activa la animación de morir
// Activa la animación de rodar
player_sprite_->setAccelY(0.2f);
player_sprite_->setVelY(-6.6f);
(rand() % 2 == 0) ? player_sprite_->setVelX(3.3f) : player_sprite_->setVelX(-3.3f);
break;
}
case PlayerState::TITLE_ANIMATION:
{
// Activa la animación de rodar
player_sprite_->setAccelY(0.2f);
player_sprite_->setVelY(-6.6f);
playSound("voice_thankyou.wav");
break;
}
case PlayerState::TITLE_HIDDEN:
{
player_sprite_->setVelX(0.0f);
player_sprite_->setVelY(0.0f);
break;
}
case PlayerState::CONTINUE_TIME_OUT:
{
// Activa la animación de morir