fase 2: fades de jd8 a màquina d'estats i helper wait_frame_or_skip a les cinemàtiques

This commit is contained in:
2026-04-15 18:12:03 +02:00
parent 7f85b50c63
commit 80fa7b46e7
3 changed files with 1414 additions and 1341 deletions

View File

@@ -186,44 +186,89 @@ void JD8_SetPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b) {
main_palette[index].b = b << 2; main_palette[index].b = b << 2;
} }
void JD8_FadeOut() { // Màquina d'estats del fade. Evita que JD8_FadeOut/JD8_FadeToPal hagen de
for (int j = 0; j < 32; j++) { // mantindre whiles interns. Cada pas aplica un delta a la paleta activa i
// el caller decideix quan fer Flip.
namespace {
enum FadeType {
FADE_NONE = 0,
FADE_OUT,
FADE_TO_PAL,
};
constexpr int FADE_STEPS = 32;
FadeType fade_type = FADE_NONE;
Color fade_target[256];
int fade_step = 0;
void apply_fade_step() {
if (fade_type == FADE_OUT) {
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
if (main_palette[i].r >= 8) main_palette[i].r = main_palette[i].r >= 8 ? main_palette[i].r - 8 : 0;
main_palette[i].r -= 8; main_palette[i].g = main_palette[i].g >= 8 ? main_palette[i].g - 8 : 0;
else main_palette[i].b = main_palette[i].b >= 8 ? main_palette[i].b - 8 : 0;
main_palette[i].r = 0; }
if (main_palette[i].g >= 8) } else if (fade_type == FADE_TO_PAL) {
main_palette[i].g -= 8; for (int i = 0; i < 256; i++) {
else main_palette[i].r = main_palette[i].r <= int(fade_target[i].r) - 8
main_palette[i].g = 0; ? main_palette[i].r + 8
if (main_palette[i].b >= 8) : fade_target[i].r;
main_palette[i].b -= 8; main_palette[i].g = main_palette[i].g <= int(fade_target[i].g) - 8
else ? main_palette[i].g + 8
main_palette[i].b = 0; : fade_target[i].g;
main_palette[i].b = main_palette[i].b <= int(fade_target[i].b) - 8
? main_palette[i].b + 8
: fade_target[i].b;
} }
JD8_Flip();
} }
} }
#define MAX(a, b) (a) > (b) ? (a) : (b) } // namespace
void JD8_FadeStartOut() {
fade_type = FADE_OUT;
fade_step = 0;
}
void JD8_FadeStartToPal(JD8_Palette pal) {
fade_type = FADE_TO_PAL;
memcpy(fade_target, pal, sizeof(Color) * 256);
fade_step = 0;
}
bool JD8_FadeIsActive() {
return fade_type != FADE_NONE;
}
bool JD8_FadeTickStep() {
if (fade_type == FADE_NONE) return true;
apply_fade_step();
fade_step++;
if (fade_step >= FADE_STEPS) {
fade_type = FADE_NONE;
return true;
}
return false;
}
void JD8_FadeOut() {
JD8_FadeStartOut();
while (true) {
const bool done = JD8_FadeTickStep();
JD8_Flip();
if (done) break;
}
}
void JD8_FadeToPal(JD8_Palette pal) { void JD8_FadeToPal(JD8_Palette pal) {
for (int j = 0; j < 32; j++) { JD8_FadeStartToPal(pal);
for (int i = 0; i < 256; i++) { while (true) {
if (main_palette[i].r <= int(pal[i].r) - 8) const bool done = JD8_FadeTickStep();
main_palette[i].r += 8;
else
main_palette[i].r = pal[i].r;
if (main_palette[i].g <= int(pal[i].g) - 8)
main_palette[i].g += 8;
else
main_palette[i].g = pal[i].g;
if (main_palette[i].b <= int(pal[i].b) - 8)
main_palette[i].b += 8;
else
main_palette[i].b = pal[i].b;
}
JD8_Flip(); JD8_Flip();
if (done) break;
} }
} }

View File

@@ -50,10 +50,21 @@ void JD8_PutPixel(JD8_Surface surface, int x, int y, Uint8 pixel);
void JD8_SetPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b); void JD8_SetPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b);
// Fades legacy bloquejants (shim damunt la màquina d'estats de sota).
void JD8_FadeOut(); void JD8_FadeOut();
void JD8_FadeToPal(JD8_Palette pal); void JD8_FadeToPal(JD8_Palette pal);
// API de fade no bloquejant (màquina d'estats). `FadeStart*` inicia el
// fade; `FadeTickStep` aplica un pas i retorna `true` quan el fade ha
// acabat. Un pas correspon visualment a una iteració del fade original
// (32 passos en total). El caller és responsable de fer el Flip entre
// passos si el vol veure animat. `FadeIsActive` permet saber si hi ha
// un fade en curs per a enllaçar-lo amb un altre subsistema.
void JD8_FadeStartOut();
void JD8_FadeStartToPal(JD8_Palette pal);
bool JD8_FadeTickStep();
bool JD8_FadeIsActive();
// JD_Font JD_LoadFont( char *file, int width, int height); // JD_Font JD_LoadFont( char *file, int width, int height);
// void JD_DrawText( int x, int y, JD_Font *source, char *text); // void JD_DrawText( int x, int y, JD_Font *source, char *text);

File diff suppressed because it is too large Load Diff