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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+4
-5
@@ -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
|
||||
|
||||
+7
-2
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user