scenes: infraestructura de la capa scenes:: (scene, timeline, sprite mover, frame animator, palette fade, surface handle, registry)

This commit is contained in:
2026-04-15 19:40:39 +02:00
parent 1507a1c740
commit 4436f7f569
17 changed files with 803 additions and 180 deletions

View File

@@ -1,4 +1,12 @@
// Port a l'API de callbacks de SDL3: el runtime posseïx el main loop i ens
// crida a SDL_AppInit/SDL_AppIterate/SDL_AppEvent/SDL_AppQuit. Imprescindible
// per al port a emscripten on no podem tindre un bucle while propi al hilo
// principal. Funciona igual en build natiu (Linux/macOS/Windows) perquè
// SDL3 embolcalla el seu propi main loop darrere d'aquestes callbacks.
#define SDL_MAIN_USE_CALLBACKS
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <ctime>
#include <string>
@@ -14,8 +22,8 @@
#include "core/system/director.hpp"
#include "game/options.hpp"
int main(int /*argc*/, char* /*args*/[]) {
srand(unsigned(time(NULL)));
SDL_AppResult SDL_AppInit(void** /*appstate*/, int /*argc*/, char* /*argv*/[]) {
srand(unsigned(time(nullptr)));
// Crea la carpeta de configuració i carrega les opcions
file_setconfigfolder("jailgames/aee");
@@ -25,7 +33,7 @@ int main(int /*argc*/, char* /*args*/[]) {
// (retorna Contents/Resources/) o en un executable normal (carpeta del binari).
const char* base_path = SDL_GetBasePath();
if (base_path) {
std::string data_path = std::string(base_path) + "data/";
const std::string data_path = std::string(base_path) + "data/";
file_setresourcefolder(data_path.c_str());
}
Options::setConfigFile(std::string(file_getconfigfolder()) + "config.yaml");
@@ -48,9 +56,33 @@ int main(int /*argc*/, char* /*args*/[]) {
Overlay::init();
Menu::init();
Director::init();
Director::get()->setup();
// Arranca el Director: crea game thread, bucle principal, sincronització de frames
Director::get()->run();
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppIterate(void* /*appstate*/) {
// Una iteració del bucle del Director. Abans els events es drenaven
// amb SDL_PollEvent dins d'aquesta funció; ara SDL ens els lliura
// d'un en un via SDL_AppEvent, així que iterate() no els toca.
if (!Director::get()->iterate()) {
return SDL_APP_SUCCESS;
}
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppEvent(void* /*appstate*/, SDL_Event* event) {
if (!event) return SDL_APP_CONTINUE;
Director::get()->handleEvent(*event);
if (Director::get()->isQuitRequested()) {
return SDL_APP_SUCCESS;
}
return SDL_APP_CONTINUE;
}
void SDL_AppQuit(void* /*appstate*/, SDL_AppResult /*result*/) {
// Neteja en ordre invers al de SDL_AppInit.
Director::get()->teardown();
Options::saveToFile();
@@ -61,6 +93,4 @@ int main(int /*argc*/, char* /*args*/[]) {
JD8_Quit();
Screen::destroy();
JG_Finalize();
return 0;
}