From 768429a7f9926d4cd048b70fa7b667f30a7b1886 Mon Sep 17 00:00:00 2001 From: Matteo Benedetto Date: Fri, 26 Jun 2026 12:44:00 +0200 Subject: [PATCH] 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) --- src/engine.c | 6 ++++++ src/globals.c | 1 + src/globals.h | 5 +++++ src/player_logic.c | 9 ++++----- src/render.c | 9 +++++++-- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/engine.c b/src/engine.c index 237d334..3cc8f5e 100644 --- a/src/engine.c +++ b/src/engine.c @@ -75,6 +75,7 @@ void engine_init(void) { hint_displayed = 0; // Mostra le istruzioni SOLO la prima volta che si gioca il livello 1 if (level == 1 && !hint_shown_once) hint_active = 1; + descend_offset = 0; // reset animazione discesa // Carica il font testuale di sistema (IBM) font_init(); @@ -256,6 +257,11 @@ void engine_update(uint8_t keys, uint8_t prev_keys) { if (game_over) { if (game_over_timer > 0) { 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... if (game_over_timer == 0) { if (game_over == 1) { diff --git a/src/globals.c b/src/globals.c index a6dc37a..a388325 100644 --- a/src/globals.c +++ b/src/globals.c @@ -48,5 +48,6 @@ uint8_t enemy_cooldown[MAX_ENEMIES] = {0}; volatile uint8_t hint_active = 0; volatile uint8_t hint_displayed = 0; volatile uint8_t hint_shown_once = 0; +volatile uint8_t descend_offset = 0; volatile uint8_t credits_active = 0; volatile uint8_t intro_active = 0; diff --git a/src/globals.h b/src/globals.h index ee6db24..a78b7a2 100644 --- a/src/globals.h +++ b/src/globals.h @@ -85,6 +85,11 @@ extern volatile uint8_t hint_displayed; // (evita che riappaiano ripetendo il livello 1) 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_active: 1 = mostra la schermata crediti (SELECT nel menu titolo) extern volatile uint8_t credits_active; diff --git a/src/player_logic.c b/src/player_logic.c index ce3078a..0a174c3 100644 --- a/src/player_logic.c +++ b/src/player_logic.c @@ -90,12 +90,11 @@ void update_player_movement(uint8_t keys, uint8_t prev_keys) { if (maze[player_ly][player_lx] == 2) { // Livello 8 completato -> finale (gioco finito); altrimenti Going Deeper (lvl successivo). 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(); - - // Effetto dissolvenza: ripulisce tutto lo schermo per mostrare la scritta VITTORIA su sfondo nero - memset(map_buffer, 0, sizeof(map_buffer)); - set_bkg_tiles(0, 0, 32, 32, map_buffer); + // Lo schermo non viene pulito subito: l'animazione di discesa + // avviene durante i 30 frame di game_over_timer. } } return; // Interrompe qui se stiamo camminando diff --git a/src/render.c b/src/render.c index d919dfc..765f609 100644 --- a/src/render.c +++ b/src/render.c @@ -296,7 +296,12 @@ void update_player_sprite(void) { y_offset = (move_progress * (16 - move_progress)) >> 2; } - // move_metasprite è fornito da png2asset e posiziona multipli sprite hardware insieme - // Il giocatore è sempre fisso al centro dello schermo (88, 88). È il mondo (sfondo) a muoversi. + // Animazione discesa botola: il giocatore scende di pochi pixel + 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); }