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;
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
|
||||
12
source/core/system/event_buffer.hpp
Normal file
12
source/core/system/event_buffer.hpp
Normal 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
|
||||
Reference in New Issue
Block a user