Aggiungi animazione di discesa nella botola

Quando il giocatore raggiunge la botola (vittoria/finale), invece di
pulire subito lo schermo, il giocatore scende di pochi pixel verso il
basso (descend_offset) per 30 frame prima che appaia la schermata
Going Deeper / finale.

- descend_offset: variabile globale, incrementata durante game_over_timer
- render.c: y_offset negativo (discesa graduale, >>1 = meta' pixel)
- player_logic.c: rimossa la dissolvenza immediata, avviata l'animazione
- engine.c: animazione durante il timer, max 12 step (~6 pixel)
This commit is contained in:
2026-06-26 12:44:00 +02:00
parent de55ba092e
commit 768429a7f9
5 changed files with 23 additions and 7 deletions
+6
View File
@@ -75,6 +75,7 @@ void engine_init(void) {
hint_displayed = 0; hint_displayed = 0;
// Mostra le istruzioni SOLO la prima volta che si gioca il livello 1 // Mostra le istruzioni SOLO la prima volta che si gioca il livello 1
if (level == 1 && !hint_shown_once) hint_active = 1; if (level == 1 && !hint_shown_once) hint_active = 1;
descend_offset = 0; // reset animazione discesa
// Carica il font testuale di sistema (IBM) // Carica il font testuale di sistema (IBM)
font_init(); font_init();
@@ -256,6 +257,11 @@ void engine_update(uint8_t keys, uint8_t prev_keys) {
if (game_over) { if (game_over) {
if (game_over_timer > 0) { if (game_over_timer > 0) {
game_over_timer--; game_over_timer--;
// Animazione di discesa nella botola (solo per vittoria/finale)
if ((game_over == 2 || game_over == 3) && descend_offset < 12) {
descend_offset++;
update_player_sprite(); // aggiorna lo sprite che scende
}
// Quando scade il timer drammatico... // Quando scade il timer drammatico...
if (game_over_timer == 0) { if (game_over_timer == 0) {
if (game_over == 1) { if (game_over == 1) {
+1
View File
@@ -48,5 +48,6 @@ uint8_t enemy_cooldown[MAX_ENEMIES] = {0};
volatile uint8_t hint_active = 0; volatile uint8_t hint_active = 0;
volatile uint8_t hint_displayed = 0; volatile uint8_t hint_displayed = 0;
volatile uint8_t hint_shown_once = 0; volatile uint8_t hint_shown_once = 0;
volatile uint8_t descend_offset = 0;
volatile uint8_t credits_active = 0; volatile uint8_t credits_active = 0;
volatile uint8_t intro_active = 0; volatile uint8_t intro_active = 0;
+5
View File
@@ -85,6 +85,11 @@ extern volatile uint8_t hint_displayed;
// (evita che riappaiano ripetendo il livello 1) // (evita che riappaiano ripetendo il livello 1)
extern volatile uint8_t hint_shown_once; extern volatile uint8_t hint_shown_once;
// --- Animazione discesa botola ---
// descend_offset: 0 = normale, >0 = il giocatore sta scendendo nella botola
// (aumenta di 1 ogni frame; a 32 il giocatore e' sparito del tutto)
extern volatile uint8_t descend_offset;
// --- Credits Screen --- // --- Credits Screen ---
// credits_active: 1 = mostra la schermata crediti (SELECT nel menu titolo) // credits_active: 1 = mostra la schermata crediti (SELECT nel menu titolo)
extern volatile uint8_t credits_active; extern volatile uint8_t credits_active;
+4 -5
View File
@@ -90,12 +90,11 @@ void update_player_movement(uint8_t keys, uint8_t prev_keys) {
if (maze[player_ly][player_lx] == 2) { if (maze[player_ly][player_lx] == 2) {
// Livello 8 completato -> finale (gioco finito); altrimenti Going Deeper (lvl successivo). // Livello 8 completato -> finale (gioco finito); altrimenti Going Deeper (lvl successivo).
game_over = (level >= 8) ? 3 : 2; game_over = (level >= 8) ? 3 : 2;
game_over_timer = 30; // Piccolo ritardo prima che la scena cambi game_over_timer = 30; // Animazione di discesa (30 frame)
descend_offset = 1; // avvia l'animazione di discesa nella botola
update_stamina_display(); update_stamina_display();
// Lo schermo non viene pulito subito: l'animazione di discesa
// Effetto dissolvenza: ripulisce tutto lo schermo per mostrare la scritta VITTORIA su sfondo nero // avviene durante i 30 frame di game_over_timer.
memset(map_buffer, 0, sizeof(map_buffer));
set_bkg_tiles(0, 0, 32, 32, map_buffer);
} }
} }
return; // Interrompe qui se stiamo camminando return; // Interrompe qui se stiamo camminando
+7 -2
View File
@@ -296,7 +296,12 @@ void update_player_sprite(void) {
y_offset = (move_progress * (16 - move_progress)) >> 2; y_offset = (move_progress * (16 - move_progress)) >> 2;
} }
// move_metasprite è fornito da png2asset e posiziona multipli sprite hardware insieme // Animazione discesa botola: il giocatore scende di pochi pixel
// Il giocatore è sempre fisso al centro dello schermo (88, 88). È il mondo (sfondo) a muoversi. if (descend_offset > 0) {
y_offset = (uint8_t)(-(int8_t)(descend_offset >> 1)); // discesa graduale
}
// move_metasprite e' fornito da png2asset e posiziona multipli sprite hardware insieme
// Il giocatore e' sempre fisso al centro dello schermo (88, 88). E' il mondo (sfondo) a muoversi.
move_metasprite(player_metasprites[player_dir * 2 + frame_offset], 0, 0, 88, 88 - y_offset); move_metasprite(player_metasprites[player_dir * 2 + frame_offset], 0, 0, 88, 88 - y_offset);
} }