callbacks de merda

This commit is contained in:
2026-04-06 15:45:28 +02:00
parent fccc27fca0
commit a52e6c709e
10 changed files with 154 additions and 110 deletions

View File

@@ -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;
}

View File

@@ -2,23 +2,35 @@
#include <SDL3/SDL.h>
#include <memory> // Para unique_ptr
#include <string> // Para string
#include "game/scene_manager.hpp" // Para SceneManager::Scene
class Logo;
class Title;
class Game;
class Director {
public:
Director(); // Constructor
~Director(); // Destructor
static auto run() -> int; // Bucle principal
Director(); // Constructor
~Director(); // Destructor
auto iterate() -> SDL_AppResult; // Una iteración del bucle principal (callback model)
private:
// --- Variables ---
std::string executable_path_; // Path del ejecutable
std::string system_folder_; // Carpeta del sistema donde guardar datos
// --- Gestión de escenas ---
SceneManager::Scene active_scene_{SceneManager::Scene::QUIT}; // Escena activa (la que tiene objeto creado)
std::unique_ptr<Logo> logo_;
std::unique_ptr<Title> title_;
std::unique_ptr<Game> game_;
// --- Funciones ---
void createSystemFolder(const std::string& folder); // Crea la carpeta del sistema donde guardar datos
void setFileList(); // Carga la configuración de assets desde assets.yaml
static void runLogo(); // Ejecuta la seccion de juego con el logo
static void runTitle(); // Ejecuta la seccion de juego con el titulo y los menus
static void runGame(); // Ejecuta la seccion de juego donde se juega
};
void destroyCurrentScene(); // Destruye la escena activa
void createScene(SceneManager::Scene scene); // Crea la escena indicada
};

View File

@@ -0,0 +1,12 @@
#pragma once
#include <SDL3/SDL.h>
#include <vector>
// Buffer global de eventos SDL para el modelo de callbacks (SDL_MAIN_USE_CALLBACKS).
// SDL_AppEvent() almacena los eventos aquí; las escenas los consumen en su handleEvents().
// El buffer se limpia al final de cada iteración en Director::iterate().
namespace EventBuffer {
inline std::vector<SDL_Event> events;
} // namespace EventBuffer