afegits MES estats a la classe Game

This commit is contained in:
2025-11-21 18:52:20 +01:00
parent e36fa95762
commit 2fd101674e
2 changed files with 75 additions and 56 deletions

View File

@@ -138,6 +138,12 @@ void Game::update() {
case State::PLAYING: case State::PLAYING:
updatePlaying(DELTA_TIME); updatePlaying(DELTA_TIME);
break; break;
case State::BLACK_SCREEN:
updateBlackScreen(DELTA_TIME);
break;
case State::GAME_OVER:
updateGameOver(DELTA_TIME);
break;
case State::FADE_TO_ENDING: case State::FADE_TO_ENDING:
updateFadeToEnding(DELTA_TIME); updateFadeToEnding(DELTA_TIME);
break; break;
@@ -165,7 +171,6 @@ void Game::updatePlaying(float delta_time) {
checkPlayerAndItems(); checkPlayerAndItems();
checkPlayerAndEnemies(); checkPlayerAndEnemies();
checkIfPlayerIsAlive(); checkIfPlayerIsAlive();
checkGameOver();
checkEndGame(); checkEndGame();
checkRestoringJail(delta_time); checkRestoringJail(delta_time);
checkSomeCheevos(); checkSomeCheevos();
@@ -177,7 +182,35 @@ void Game::updatePlaying(float delta_time) {
} }
scoreboard_->update(delta_time); scoreboard_->update(delta_time);
keepMusicPlaying(); 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 // 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 // Cambia al estado especificado y resetea los timers
void Game::transitionToState(State new_state) { 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_ = new_state;
state_time_ = 0.0F; state_time_ = 0.0F;
fade_accumulator_ = 0.0F; fade_accumulator_ = 0.0F;
@@ -228,6 +271,12 @@ void Game::render() {
case State::PLAYING: case State::PLAYING:
renderPlaying(); renderPlaying();
break; break;
case State::BLACK_SCREEN:
renderBlackScreen();
break;
case State::GAME_OVER:
renderGameOver();
break;
case State::FADE_TO_ENDING: case State::FADE_TO_ENDING:
renderFadeToEnding(); renderFadeToEnding();
break; break;
@@ -251,7 +300,6 @@ void Game::renderPlaying() {
} }
renderRoomName(); renderRoomName();
scoreboard_->render(); scoreboard_->render();
renderBlackScreen();
#ifdef _DEBUG #ifdef _DEBUG
// Debug info // Debug info
@@ -262,6 +310,22 @@ void Game::renderPlaying() {
Screen::get()->render(); 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) // Renderiza el juego en estado FADE_TO_ENDING (via backbuffer)
void Game::renderFadeToEnding() { void Game::renderFadeToEnding() {
// 1. Guardar renderer actual // 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 // Mata al jugador
void Game::killPlayer() { void Game::killPlayer() {
if (Options::cheats.invincible == Options::Cheat::State::ENABLED) { if (Options::cheats.invincible == Options::Cheat::State::ENABLED) {
@@ -481,46 +538,8 @@ void Game::killPlayer() {
// Sonido // Sonido
Audio::get()->playSound("death.wav", Audio::Group::GAME); Audio::get()->playSound("death.wav", Audio::Group::GAME);
// Pone la pantalla en negro un tiempo // Transicionar al estado BLACK_SCREEN (el respawn ocurre en transitionToState)
setBlackScreen(); transitionToState(State::BLACK_SCREEN);
// 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);
}
} }
// Pone el color del marcador en función del color del borde de la habitación // Pone el color del marcador en función del color del borde de la habitación

View File

@@ -25,6 +25,8 @@ class Game {
enum class State { enum class State {
PLAYING, // Normal gameplay PLAYING, // Normal gameplay
BLACK_SCREEN, // Black screen after death (0.30s)
GAME_OVER, // Intermediate state before changing scene
FADE_TO_ENDING, // Fade out transition FADE_TO_ENDING, // Fade out transition
POST_FADE_ENDING, // Black screen delay before ending POST_FADE_ENDING, // Black screen delay before ending
}; };
@@ -59,9 +61,13 @@ class Game {
void renderRoomName(); // Escribe el nombre de la pantalla void renderRoomName(); // Escribe el nombre de la pantalla
void transitionToState(State new_state); // Cambia al estado especificado y resetea los timers void transitionToState(State new_state); // Cambia al estado especificado y resetea los timers
void updatePlaying(float delta_time); // Actualiza el juego en estado PLAYING void updatePlaying(float delta_time); // Actualiza el juego en estado PLAYING
void updateBlackScreen(float delta_time); // Actualiza el juego en estado BLACK_SCREEN
void updateGameOver(float delta_time); // Actualiza el juego en estado GAME_OVER
void updateFadeToEnding(float delta_time); // Actualiza el juego en estado FADE_TO_ENDING void updateFadeToEnding(float delta_time); // Actualiza el juego en estado FADE_TO_ENDING
void updatePostFadeEnding(float delta_time); // Actualiza el juego en estado POST_FADE_ENDING void updatePostFadeEnding(float delta_time); // Actualiza el juego en estado POST_FADE_ENDING
void renderPlaying(); // Renderiza el juego en estado PLAYING (directo a pantalla) void renderPlaying(); // Renderiza el juego en estado PLAYING (directo a pantalla)
void renderBlackScreen(); // Renderiza el juego en estado BLACK_SCREEN (pantalla negra)
void renderGameOver(); // Renderiza el juego en estado GAME_OVER (pantalla negra)
void renderFadeToEnding(); // Renderiza el juego en estado FADE_TO_ENDING (via backbuffer) void renderFadeToEnding(); // Renderiza el juego en estado FADE_TO_ENDING (via backbuffer)
void renderPostFadeEnding(); // Renderiza el juego en estado POST_FADE_ENDING (pantalla negra) void renderPostFadeEnding(); // Renderiza el juego en estado POST_FADE_ENDING (pantalla negra)
auto changeRoom(const std::string& room_path) -> bool; // Cambia de habitación auto changeRoom(const std::string& room_path) -> bool; // Cambia de habitación
@@ -70,11 +76,7 @@ class Game {
auto checkPlayerAndEnemies() -> bool; // Comprueba las colisiones del jugador con los enemigos auto checkPlayerAndEnemies() -> bool; // Comprueba las colisiones del jugador con los enemigos
void checkPlayerAndItems(); // Comprueba las colisiones del jugador con los objetos void checkPlayerAndItems(); // Comprueba las colisiones del jugador con los objetos
void checkIfPlayerIsAlive(); // Comprueba si el jugador esta vivo void checkIfPlayerIsAlive(); // Comprueba si el jugador esta vivo
void checkGameOver(); // Comprueba si ha terminado la partida
void killPlayer(); // Mata al jugador void killPlayer(); // Mata al jugador
void setBlackScreen(); // Establece la pantalla en negro
void updateBlackScreen(float delta_time); // Actualiza las variables relativas a la pantalla en negro
void renderBlackScreen() const; // Dibuja la pantalla negra
void setScoreBoardColor(); // Pone el color del marcador en función del color del borde de la habitación void setScoreBoardColor(); // Pone el color del marcador en función del color del borde de la habitación
auto checkEndGame() -> bool; // Comprueba si ha finalizado el juego auto checkEndGame() -> bool; // Comprueba si ha finalizado el juego
static auto getTotalItems() -> int; // Obtiene la cantidad total de items que hay en el mapeado del juego static auto getTotalItems() -> int; // Obtiene la cantidad total de items que hay en el mapeado del juego
@@ -121,8 +123,6 @@ class Game {
DemoData demo_; // Variables para el modo demo DemoData demo_; // Variables para el modo demo
// Variables de efectos visuales // Variables de efectos visuales
bool black_screen_{false}; // Indica si la pantalla está en negro. Se utiliza para la muerte del jugador
float black_screen_time_{0.0F}; // Tiempo acumulado en pantalla negra en segundos
SDL_FRect room_name_rect_; // Rectangulo donde pintar la textura con el nombre de la habitación SDL_FRect room_name_rect_; // Rectangulo donde pintar la textura con el nombre de la habitación
float jail_restore_time_{0.0F}; // Tiempo acumulado para restauración de vidas en la Jail float jail_restore_time_{0.0F}; // Tiempo acumulado para restauración de vidas en la Jail
}; };