diff --git a/source/game/defaults.hpp b/source/game/defaults.hpp index 1c4ea2c..b3d0886 100644 --- a/source/game/defaults.hpp +++ b/source/game/defaults.hpp @@ -66,7 +66,7 @@ constexpr bool ENABLED = true; // Sonido habilitado por defecto namespace Cheat { constexpr bool INFINITE_LIVES = false; // Vidas infinitas desactivadas por defecto constexpr bool INVINCIBLE = false; // Invencibilidad desactivada por defecto -constexpr bool JAIL_IS_OPEN = false; // Jail abierta desactivada por defecto +constexpr bool JAIL_IS_OPEN = true; // Jail abierta desactivada por defecto constexpr bool ALTERNATE_SKIN = false; // Skin alternativa desactivada por defecto } // namespace Cheat diff --git a/source/game/gameplay/room.cpp b/source/game/gameplay/room.cpp index 0c14f6e..ca04720 100644 --- a/source/game/gameplay/room.cpp +++ b/source/game/gameplay/room.cpp @@ -25,12 +25,11 @@ Room::Room(const std::string& room_path, std::shared_ptr data) item_manager_ = std::make_unique(room->name, data_); initializeRoom(*room); + openTheJail(); // Abre la Jail si se da el caso // Crea el mapa de colisiones (necesita tile_map_, tile_set_width_, conveyor_belt_direction_) collision_map_ = std::make_unique(tile_map_, tile_set_width_, conveyor_belt_direction_); - openTheJail(); // Abre la Jail si se da el caso - // Crea el renderizador del tilemap (necesita tile_map_, tile_set_width_, surface_, bg_color_, conveyor_belt_direction_) tilemap_renderer_ = std::make_unique(tile_map_, tile_set_width_, surface_, bg_color_, conveyor_belt_direction_); tilemap_renderer_->initialize(collision_map_.get()); // Inicializa (crea map_surface, pinta tiles, busca animados) diff --git a/source/game/scenes/game.cpp b/source/game/scenes/game.cpp index ae3094e..2c1852f 100644 --- a/source/game/scenes/game.cpp +++ b/source/game/scenes/game.cpp @@ -54,6 +54,7 @@ Game::Game(Mode mode) total_items_ = getTotalItems(); createRoomNameTexture(); + game_backbuffer_surface_ = std::make_shared(Options::game.width, Options::game.height); changeRoom(current_room_); Cheevos::get()->enable(!Options::cheats.enabled()); // Deshabilita los logros si hay trucos activados @@ -191,11 +192,11 @@ void Game::updateFadeToEnding(float delta_time) { scoreboard_->update(delta_time); keepMusicPlaying(); - // Aplica el fade progresivo + // Aplica el fade progresivo al BACKBUFFER (no al renderer de pantalla) fade_accumulator_ += delta_time; if (fade_accumulator_ >= FADE_STEP_INTERVAL) { fade_accumulator_ = 0.0F; - if (Screen::get()->getRendererSurface()->fadeSubPalette()) { + if (game_backbuffer_surface_->fadeSubPalette()) { // Fade completado, transicionar a POST_FADE transitionToState(State::POST_FADE_ENDING); } @@ -222,6 +223,22 @@ void Game::transitionToState(State new_state) { // Pinta los objetos en pantalla void Game::render() { + // Dispatch por estado + switch (state_) { + case State::PLAYING: + renderPlaying(); + break; + case State::FADE_TO_ENDING: + renderFadeToEnding(); + break; + case State::POST_FADE_ENDING: + renderPostFadeEnding(); + break; + } +} + +// Renderiza el juego en estado PLAYING (directo a pantalla) +void Game::renderPlaying() { // Prepara para dibujar el frame Screen::get()->start(); @@ -245,6 +262,39 @@ void Game::render() { Screen::get()->render(); } +// Renderiza el juego en estado FADE_TO_ENDING (via backbuffer) +void Game::renderFadeToEnding() { + // 1. Guardar renderer actual + auto previous_renderer = Screen::get()->getRendererSurface(); + + // 2. Cambiar target a backbuffer + Screen::get()->setRendererSurface(game_backbuffer_surface_); + + // 3. Renderizar todo a backbuffer + game_backbuffer_surface_->clear(static_cast(PaletteColor::BLACK)); + room_->renderMap(); + room_->renderEnemies(); + room_->renderItems(); + player_->render(); // Player congelado pero visible + renderRoomName(); + scoreboard_->render(); + + // 4. Restaurar renderer original + Screen::get()->setRendererSurface(previous_renderer); + + // 5. Preparar pantalla y volcar backbuffer (fade YA aplicado en update) + Screen::get()->start(); + game_backbuffer_surface_->render(); + Screen::get()->render(); +} + +// Renderiza el juego en estado POST_FADE_ENDING (pantalla negra) +void Game::renderPostFadeEnding() { + Screen::get()->start(); + Screen::get()->clearSurface(static_cast(PaletteColor::BLACK)); + Screen::get()->render(); +} + #ifdef _DEBUG // Pasa la información de debug void Game::updateDebugInfo() { diff --git a/source/game/scenes/game.hpp b/source/game/scenes/game.hpp index ecc8762..30514b1 100644 --- a/source/game/scenes/game.hpp +++ b/source/game/scenes/game.hpp @@ -43,7 +43,7 @@ class Game { static constexpr float DEMO_ROOM_DURATION = 6.0F; // Duración de cada habitación en modo demo en segundos (400 frames) static constexpr float JAIL_RESTORE_INTERVAL = 1.5F; // Intervalo de restauración de vidas en la Jail en segundos (100 frames) static constexpr float FADE_STEP_INTERVAL = 0.05F; // Intervalo entre pasos de fade en segundos - static constexpr float POST_FADE_DELAY = 1.0F; // Duración de la pantalla negra después del fade + static constexpr float POST_FADE_DELAY = 2.0F; // Duración de la pantalla negra después del fade // --- Estructuras --- struct DemoData { @@ -61,6 +61,9 @@ class Game { void updatePlaying(float delta_time); // Actualiza el juego en estado PLAYING 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 renderPlaying(); // Renderiza el juego en estado PLAYING (directo a pantalla) + void renderFadeToEnding(); // Renderiza el juego en estado FADE_TO_ENDING (via backbuffer) + void renderPostFadeEnding(); // Renderiza el juego en estado POST_FADE_ENDING (pantalla negra) auto changeRoom(const std::string& room_path) -> bool; // Cambia de habitación void handleInput(); // Comprueba el teclado void checkPlayerIsOnBorder(); // Comprueba si el jugador esta en el borde de la pantalla y actua @@ -94,13 +97,14 @@ class Game { // --- Variables miembro --- // Objetos y punteros a recursos - std::shared_ptr board_; // Estructura con los datos del marcador - std::shared_ptr scoreboard_; // Objeto encargado de gestionar el marcador - std::shared_ptr room_tracker_; // Lleva el control de las habitaciones visitadas - std::shared_ptr room_; // Objeto encargado de gestionar cada habitación del juego - std::shared_ptr player_; // Objeto con el jugador - std::shared_ptr stats_; // Objeto encargado de gestionar las estadísticas - std::shared_ptr room_name_surface_; // Textura para escribir el nombre de la habitación + std::shared_ptr board_; // Estructura con los datos del marcador + std::shared_ptr scoreboard_; // Objeto encargado de gestionar el marcador + std::shared_ptr room_tracker_; // Lleva el control de las habitaciones visitadas + std::shared_ptr room_; // Objeto encargado de gestionar cada habitación del juego + std::shared_ptr player_; // Objeto con el jugador + std::shared_ptr stats_; // Objeto encargado de gestionar las estadísticas + std::shared_ptr room_name_surface_; // Textura para escribir el nombre de la habitación + std::shared_ptr game_backbuffer_surface_; // Backbuffer para efectos de fade // Variables de estado del juego Mode mode_; // Modo del juego