afegits MES estats a la classe Game
This commit is contained in:
@@ -138,6 +138,12 @@ void Game::update() {
|
||||
case State::PLAYING:
|
||||
updatePlaying(DELTA_TIME);
|
||||
break;
|
||||
case State::BLACK_SCREEN:
|
||||
updateBlackScreen(DELTA_TIME);
|
||||
break;
|
||||
case State::GAME_OVER:
|
||||
updateGameOver(DELTA_TIME);
|
||||
break;
|
||||
case State::FADE_TO_ENDING:
|
||||
updateFadeToEnding(DELTA_TIME);
|
||||
break;
|
||||
@@ -165,7 +171,6 @@ void Game::updatePlaying(float delta_time) {
|
||||
checkPlayerAndItems();
|
||||
checkPlayerAndEnemies();
|
||||
checkIfPlayerIsAlive();
|
||||
checkGameOver();
|
||||
checkEndGame();
|
||||
checkRestoringJail(delta_time);
|
||||
checkSomeCheevos();
|
||||
@@ -177,7 +182,35 @@ void Game::updatePlaying(float delta_time) {
|
||||
}
|
||||
scoreboard_->update(delta_time);
|
||||
keepMusicPlaying();
|
||||
updateBlackScreen(delta_time);
|
||||
}
|
||||
|
||||
// Actualiza el juego en estado BLACK_SCREEN
|
||||
void Game::updateBlackScreen(float delta_time) {
|
||||
state_time_ += delta_time;
|
||||
|
||||
// Si se acabaron las vidas Y pasó el threshold → GAME_OVER
|
||||
if (board_->lives < 0 && state_time_ > GAME_OVER_THRESHOLD) {
|
||||
transitionToState(State::GAME_OVER);
|
||||
return;
|
||||
}
|
||||
|
||||
// Si pasó la duración completa → volver a PLAYING
|
||||
if (state_time_ > BLACK_SCREEN_DURATION) {
|
||||
// Despausar al salir
|
||||
player_->setPaused(false);
|
||||
room_->setPaused(false);
|
||||
Screen::get()->setBorderColor(room_->getBorderColor());
|
||||
transitionToState(State::PLAYING);
|
||||
}
|
||||
}
|
||||
|
||||
// Actualiza el juego en estado GAME_OVER
|
||||
void Game::updateGameOver(float delta_time) {
|
||||
// Pequeño delay antes de cambiar escena
|
||||
state_time_ += delta_time;
|
||||
if (state_time_ > 0.1F) { // 100ms de delay mínimo
|
||||
SceneManager::current = SceneManager::Scene::GAME_OVER;
|
||||
}
|
||||
}
|
||||
|
||||
// Actualiza el juego en estado FADE_TO_ENDING
|
||||
@@ -216,6 +249,16 @@ void Game::updatePostFadeEnding(float delta_time) {
|
||||
|
||||
// Cambia al estado especificado y resetea los timers
|
||||
void Game::transitionToState(State new_state) {
|
||||
// Lógica de ENTRADA según el nuevo estado
|
||||
if (new_state == State::BLACK_SCREEN) {
|
||||
// Respawn room y player
|
||||
room_ = std::make_shared<Room>(current_room_, board_);
|
||||
initPlayer(spawn_data_, room_);
|
||||
// Pausar ambos
|
||||
room_->setPaused(true);
|
||||
player_->setPaused(true);
|
||||
}
|
||||
|
||||
state_ = new_state;
|
||||
state_time_ = 0.0F;
|
||||
fade_accumulator_ = 0.0F;
|
||||
@@ -228,6 +271,12 @@ void Game::render() {
|
||||
case State::PLAYING:
|
||||
renderPlaying();
|
||||
break;
|
||||
case State::BLACK_SCREEN:
|
||||
renderBlackScreen();
|
||||
break;
|
||||
case State::GAME_OVER:
|
||||
renderGameOver();
|
||||
break;
|
||||
case State::FADE_TO_ENDING:
|
||||
renderFadeToEnding();
|
||||
break;
|
||||
@@ -251,7 +300,6 @@ void Game::renderPlaying() {
|
||||
}
|
||||
renderRoomName();
|
||||
scoreboard_->render();
|
||||
renderBlackScreen();
|
||||
|
||||
#ifdef _DEBUG
|
||||
// Debug info
|
||||
@@ -262,6 +310,22 @@ void Game::renderPlaying() {
|
||||
Screen::get()->render();
|
||||
}
|
||||
|
||||
// Renderiza el juego en estado BLACK_SCREEN (pantalla negra)
|
||||
void Game::renderBlackScreen() {
|
||||
Screen::get()->start();
|
||||
auto const COLOR = static_cast<Uint8>(PaletteColor::BLACK);
|
||||
Screen::get()->clearSurface(COLOR);
|
||||
Screen::get()->setBorderColor(COLOR);
|
||||
Screen::get()->render();
|
||||
}
|
||||
|
||||
// Renderiza el juego en estado GAME_OVER (pantalla negra)
|
||||
void Game::renderGameOver() {
|
||||
Screen::get()->start();
|
||||
Screen::get()->clearSurface(static_cast<Uint8>(PaletteColor::BLACK));
|
||||
Screen::get()->render();
|
||||
}
|
||||
|
||||
// Renderiza el juego en estado FADE_TO_ENDING (via backbuffer)
|
||||
void Game::renderFadeToEnding() {
|
||||
// 1. Guardar renderer actual
|
||||
@@ -454,13 +518,6 @@ void Game::checkIfPlayerIsAlive() {
|
||||
}
|
||||
}
|
||||
|
||||
// Comprueba si ha terminado la partida
|
||||
void Game::checkGameOver() {
|
||||
if (board_->lives < 0 && black_screen_time_ > GAME_OVER_THRESHOLD) {
|
||||
SceneManager::current = SceneManager::Scene::GAME_OVER;
|
||||
}
|
||||
}
|
||||
|
||||
// Mata al jugador
|
||||
void Game::killPlayer() {
|
||||
if (Options::cheats.invincible == Options::Cheat::State::ENABLED) {
|
||||
@@ -481,46 +538,8 @@ void Game::killPlayer() {
|
||||
// Sonido
|
||||
Audio::get()->playSound("death.wav", Audio::Group::GAME);
|
||||
|
||||
// Pone la pantalla en negro un tiempo
|
||||
setBlackScreen();
|
||||
|
||||
// Crea la nueva habitación y el nuevo jugador
|
||||
room_ = std::make_shared<Room>(current_room_, board_);
|
||||
initPlayer(spawn_data_, room_);
|
||||
|
||||
// Pone los objetos en pausa mientras esta la habitación en negro
|
||||
room_->setPaused(true);
|
||||
player_->setPaused(true);
|
||||
}
|
||||
|
||||
// Establece la pantalla en negro
|
||||
void Game::setBlackScreen() {
|
||||
black_screen_ = true;
|
||||
}
|
||||
|
||||
// Actualiza las variables relativas a la pantalla en negro
|
||||
void Game::updateBlackScreen(float delta_time) {
|
||||
if (black_screen_) {
|
||||
black_screen_time_ += delta_time;
|
||||
if (black_screen_time_ > BLACK_SCREEN_DURATION) {
|
||||
black_screen_ = false;
|
||||
black_screen_time_ = 0.0F;
|
||||
|
||||
player_->setPaused(false);
|
||||
room_->setPaused(false);
|
||||
Screen::get()->setBorderColor(room_->getBorderColor());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dibuja la pantalla negra
|
||||
void Game::renderBlackScreen() const {
|
||||
if (black_screen_) {
|
||||
auto const COLOR = static_cast<Uint8>(PaletteColor::BLACK);
|
||||
Screen::get()->setRendererSurface();
|
||||
Screen::get()->clearSurface(COLOR);
|
||||
Screen::get()->setBorderColor(COLOR);
|
||||
}
|
||||
// Transicionar al estado BLACK_SCREEN (el respawn ocurre en transitionToState)
|
||||
transitionToState(State::BLACK_SCREEN);
|
||||
}
|
||||
|
||||
// Pone el color del marcador en función del color del borde de la habitación
|
||||
|
||||
Reference in New Issue
Block a user