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:
@@ -186,44 +186,89 @@ void JD8_SetPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b) {
|
||||
main_palette[index].b = b << 2;
|
||||
}
|
||||
|
||||
void JD8_FadeOut() {
|
||||
for (int j = 0; j < 32; j++) {
|
||||
// Màquina d'estats del fade. Evita que JD8_FadeOut/JD8_FadeToPal hagen de
|
||||
// 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++) {
|
||||
if (main_palette[i].r >= 8)
|
||||
main_palette[i].r -= 8;
|
||||
else
|
||||
main_palette[i].r = 0;
|
||||
if (main_palette[i].g >= 8)
|
||||
main_palette[i].g -= 8;
|
||||
else
|
||||
main_palette[i].g = 0;
|
||||
if (main_palette[i].b >= 8)
|
||||
main_palette[i].b -= 8;
|
||||
else
|
||||
main_palette[i].b = 0;
|
||||
main_palette[i].r = main_palette[i].r >= 8 ? main_palette[i].r - 8 : 0;
|
||||
main_palette[i].g = main_palette[i].g >= 8 ? main_palette[i].g - 8 : 0;
|
||||
main_palette[i].b = main_palette[i].b >= 8 ? main_palette[i].b - 8 : 0;
|
||||
}
|
||||
} else if (fade_type == FADE_TO_PAL) {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
main_palette[i].r = main_palette[i].r <= int(fade_target[i].r) - 8
|
||||
? main_palette[i].r + 8
|
||||
: fade_target[i].r;
|
||||
main_palette[i].g = main_palette[i].g <= int(fade_target[i].g) - 8
|
||||
? main_palette[i].g + 8
|
||||
: 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) {
|
||||
for (int j = 0; j < 32; j++) {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
if (main_palette[i].r <= int(pal[i].r) - 8)
|
||||
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_FadeStartToPal(pal);
|
||||
while (true) {
|
||||
const bool done = JD8_FadeTickStep();
|
||||
JD8_Flip();
|
||||
if (done) break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
// Fades legacy bloquejants (shim damunt la màquina d'estats de sota).
|
||||
void JD8_FadeOut();
|
||||
|
||||
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);
|
||||
|
||||
// void JD_DrawText( int x, int y, JD_Font *source, char *text);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user