callbacks de merda
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "core/resources/resource_helper.hpp" // Para ResourceHelper
|
||||
#include "core/resources/resource_list.hpp" // Para Asset, AssetType
|
||||
#include "core/resources/resource_loader.hpp" // Para ResourceLoader
|
||||
#include "core/system/event_buffer.hpp" // Para EventBuffer
|
||||
#include "game/gameplay/cheevos.hpp" // Para Cheevos
|
||||
#include "game/options.hpp" // Para Options, options, OptionsVideo
|
||||
#include "game/scene_manager.hpp" // Para SceneManager
|
||||
@@ -319,58 +320,80 @@ void Director::setFileList() { // NOLINT(readability-convert-member-functions-t
|
||||
Resource::List::get()->loadFromFile(config_path, PREFIX, system_folder_);
|
||||
}
|
||||
|
||||
// Ejecuta la seccion de juego con el logo
|
||||
void Director::runLogo() {
|
||||
auto logo = std::make_unique<Logo>();
|
||||
logo->run();
|
||||
// Destruye la escena activa
|
||||
void Director::destroyCurrentScene() {
|
||||
logo_.reset();
|
||||
title_.reset();
|
||||
game_.reset();
|
||||
active_scene_ = SceneManager::Scene::QUIT;
|
||||
}
|
||||
|
||||
// Ejecuta la seccion de juego con el titulo y los menus
|
||||
void Director::runTitle() {
|
||||
auto title = std::make_unique<Title>();
|
||||
title->run();
|
||||
}
|
||||
// Crea la escena indicada
|
||||
void Director::createScene(SceneManager::Scene scene) {
|
||||
destroyCurrentScene();
|
||||
|
||||
// Ejecuta la seccion de juego donde se juega
|
||||
void Director::runGame() {
|
||||
Audio::get()->stopMusic();
|
||||
auto game = std::make_unique<Game>(Game::Mode::GAME);
|
||||
game->run();
|
||||
}
|
||||
switch (scene) {
|
||||
case SceneManager::Scene::LOGO:
|
||||
logo_ = std::make_unique<Logo>();
|
||||
break;
|
||||
|
||||
auto Director::run() -> int {
|
||||
// Bucle principal
|
||||
while (SceneManager::current != SceneManager::Scene::QUIT) {
|
||||
const SceneManager::Scene ACTIVE = SceneManager::current;
|
||||
case SceneManager::Scene::TITLE:
|
||||
title_ = std::make_unique<Title>();
|
||||
break;
|
||||
|
||||
switch (SceneManager::current) {
|
||||
case SceneManager::Scene::LOGO:
|
||||
runLogo();
|
||||
break;
|
||||
case SceneManager::Scene::GAME:
|
||||
Audio::get()->stopMusic();
|
||||
game_ = std::make_unique<Game>(Game::Mode::GAME);
|
||||
break;
|
||||
|
||||
case SceneManager::Scene::TITLE:
|
||||
runTitle();
|
||||
break;
|
||||
|
||||
case SceneManager::Scene::GAME:
|
||||
runGame();
|
||||
break;
|
||||
|
||||
case SceneManager::Scene::RESTART_CURRENT:
|
||||
// La escena salió por RESTART_CURRENT → relanzar la escena guardada
|
||||
SceneManager::current = SceneManager::scene_before_restart;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Si la escena que acaba de correr dejó RESTART_CURRENT pendiente,
|
||||
// restaurar la escena que estaba activa para relanzarla en la próxima iteración
|
||||
if (SceneManager::current == SceneManager::Scene::RESTART_CURRENT) {
|
||||
SceneManager::current = ACTIVE;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
active_scene_ = scene;
|
||||
}
|
||||
|
||||
// Una iteración del bucle principal (callback model)
|
||||
auto Director::iterate() -> SDL_AppResult {
|
||||
// Resolver RESTART_CURRENT antes de comprobar escena
|
||||
if (SceneManager::current == SceneManager::Scene::RESTART_CURRENT) {
|
||||
SceneManager::current = SceneManager::scene_before_restart;
|
||||
}
|
||||
|
||||
// Salir si se ha pedido QUIT
|
||||
if (SceneManager::current == SceneManager::Scene::QUIT) {
|
||||
EventBuffer::events.clear();
|
||||
return SDL_APP_SUCCESS;
|
||||
}
|
||||
|
||||
// Si la escena solicitada no coincide con la activa, crear la nueva
|
||||
if (SceneManager::current != active_scene_) {
|
||||
createScene(SceneManager::current);
|
||||
}
|
||||
|
||||
// Ejecutar un frame de la escena activa
|
||||
switch (active_scene_) {
|
||||
case SceneManager::Scene::LOGO:
|
||||
logo_->update();
|
||||
logo_->render();
|
||||
break;
|
||||
|
||||
case SceneManager::Scene::TITLE:
|
||||
title_->update();
|
||||
title_->render();
|
||||
break;
|
||||
|
||||
case SceneManager::Scene::GAME:
|
||||
game_->update();
|
||||
game_->render();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Limpiar el buffer de eventos tras cada frame
|
||||
EventBuffer::events.clear();
|
||||
|
||||
return SDL_APP_CONTINUE;
|
||||
}
|
||||
Reference in New Issue
Block a user