step B.1: fades de ModuleGame tick-based amb scenes::PaletteFade (fases FadingIn/FadingOut sense redibuixar, per no perdre el frame final)

This commit is contained in:
2026-04-16 10:27:04 +02:00
parent f9346add79
commit 4e18f83ec5
3 changed files with 284 additions and 218 deletions

View File

@@ -37,11 +37,11 @@ Director* Director::instance_ = nullptr;
namespace {
// Entry del fiber del joc. Alterna entre la capa `scenes::` (cinemàtiques
// i menús, triats per `info::ctx.num_piramide` via el SceneRegistry) i
// ModuleGame (gameplay) fins que el joc demana eixir. Quan el codi de
// gameplay o una escena crida JD8_Flip(), el control torna automàticament
// al Director via `GameFiber::yield()`.
// Entry del fiber del joc. Dispatcha a una escena segons l'estat actual:
// `gameState == 0` → ModuleGame (gameplay), `gameState == 1` → una
// `scenes::Scene` del registry triada per `info::ctx.num_piramide`. Cada
// escena és tick-based; el JD8_Flip() entre ticks cedeix al Director
// via `GameFiber::yield()`.
void gameFiberEntry() {
info::ctx.num_habitacio = Options::game.habitacio_inicial;
info::ctx.num_piramide = Options::game.piramide_inicial;
@@ -60,31 +60,29 @@ void gameFiberEntry() {
int gameState = 1;
while (gameState != -1 && !JG_Quitting()) {
std::unique_ptr<scenes::Scene> scene;
if (gameState == 0) {
// Gameplay pur (ModuleGame encara és cooperatiu-clàssic: conté
// el seu while intern i crida JD8_Flip manualment). Fora
// d'abast de la migració scenes:: — es tractarà en una fase
// posterior quan el fiber es puga eliminar.
auto* mg = new ModuleGame();
gameState = mg->Go();
delete mg;
continue;
// Gameplay. ModuleGame és una scenes::Scene des de Phase A de
// la migració — mateix mini-loop tick+flip que la resta.
scene = std::make_unique<ModuleGame>();
} else {
// gameState == 1: dispatch al registry per num_piramide. El
// vell ModuleSequence::Go() feia aquest redirect al principi:
// si el jugador arriba a la Secreta (6) sense prou diners,
// salta als slides de fracàs (7) abans de buscar l'escena.
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) {
info::ctx.num_piramide = 7;
}
scene = scenes::SceneRegistry::instance().tryCreate(info::ctx.num_piramide);
}
// gameState == 1: dispatch a la capa scenes::.
// El vell `ModuleSequence::Go()` feia aquest redirect al principi:
// si el jugador arriba a la Secreta (6) sense prou diners, salta
// als slides de fracàs (7) abans de buscar l'escena al registry.
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) {
info::ctx.num_piramide = 7;
}
auto scene = scenes::SceneRegistry::instance().tryCreate(info::ctx.num_piramide);
if (!scene) {
// State no registrat — indica un bug del dispatcher o del
// registre d'escenes. Eixim ordenadament en lloc de cremar CPU.
break;
}
scene->onEnter();
Uint32 last = SDL_GetTicks();
while (!scene->done() && !JG_Quitting()) {