Fix garbage dopo chiusura hint: usa Window layer invece di BG
Best practice GBDK: il Window layer ha un tile map separato (0x9C00) rispetto al BG (0x9800). Usando set_win_tiles + SHOW_WIN per il testo delle istruzioni, il BG map del gameplay non viene mai toccato. Alla chiusura basta HIDE_WIN: niente garbage, niente flush differito. Ripristino tile: set_bkg_data (maze) + set_sprite_data (player/enemy/ stamina/level) + draw_map + update_camera + update_player_sprite.
This commit is contained in:
+15
-5
@@ -233,12 +233,10 @@ void engine_update(uint8_t keys, uint8_t prev_keys) {
|
|||||||
if (!hint_displayed) {
|
if (!hint_displayed) {
|
||||||
hint_displayed = 1;
|
hint_displayed = 1;
|
||||||
HIDE_SPRITES;
|
HIDE_SPRITES;
|
||||||
SCX_REG = 0;
|
|
||||||
SCY_REG = 0;
|
|
||||||
font_init();
|
font_init();
|
||||||
font_t hint_font = font_load(font_ibm);
|
font_t hint_font = font_load(font_ibm);
|
||||||
font_set(hint_font);
|
font_set(hint_font);
|
||||||
BGP_REG = 0x1B;
|
BGP_REG = 0x1B; // palette invertita (sfondo nero, testo chiaro)
|
||||||
memset(map_buffer, 0, sizeof(map_buffer));
|
memset(map_buffer, 0, sizeof(map_buffer));
|
||||||
ending_puttext(3, 2, "A SCREAM FROM");
|
ending_puttext(3, 2, "A SCREAM FROM");
|
||||||
ending_puttext(6, 3, "THE DARK");
|
ending_puttext(6, 3, "THE DARK");
|
||||||
@@ -248,13 +246,25 @@ void engine_update(uint8_t keys, uint8_t prev_keys) {
|
|||||||
ending_puttext(2, 10, "B RUN");
|
ending_puttext(2, 10, "B RUN");
|
||||||
ending_puttext(2, 12, "PRESS B START");
|
ending_puttext(2, 12, "PRESS B START");
|
||||||
ending_puttext(4, 14, "SELECT HELP");
|
ending_puttext(4, 14, "SELECT HELP");
|
||||||
set_bkg_tiles(0, 0, 32, 32, map_buffer);
|
// Usa il WINDOW layer (tile map separato a 0x9C00) per il testo:
|
||||||
|
// il BG map del gameplay (0x9800) resta intatto -> niente garbage
|
||||||
|
// quando si chiude l'hint. move_win(7,0) allinea a sinistra (-7 offset).
|
||||||
|
set_win_tiles(0, 0, 32, 32, map_buffer);
|
||||||
|
move_win(7, 0);
|
||||||
|
SHOW_WIN;
|
||||||
}
|
}
|
||||||
// B chiude la schermata e riprende il gioco
|
// B chiude la schermata e riprende il gioco
|
||||||
if ((keys & J_B) && !(prev_keys & J_B)) {
|
if ((keys & J_B) && !(prev_keys & J_B)) {
|
||||||
|
HIDE_WIN; // nascondi il Window: il BG map del gameplay e' intatto
|
||||||
BGP_REG = 0xE4;
|
BGP_REG = 0xE4;
|
||||||
|
// Ripristina i tile del maze in VRAM (font_load li aveva sovrascritti)
|
||||||
set_bkg_data(0, tiles_TILE_COUNT, tiles_tiles);
|
set_bkg_data(0, tiles_TILE_COUNT, tiles_tiles);
|
||||||
draw_map(player_lx, player_ly);
|
// Ricarica i tile degli sprite (stessa tile RAM condivisa)
|
||||||
|
set_sprite_data(0, player_TILE_COUNT, player_tiles);
|
||||||
|
set_sprite_data(player_TILE_COUNT, enemy_TILE_COUNT, enemy_tiles);
|
||||||
|
set_sprite_data(tiles_TILE_COUNT, stamina_TILE_COUNT * 2, stamina_tiles);
|
||||||
|
set_sprite_data(LEVEL_SPRITE_BASE, level_TILE_COUNT, level_tiles);
|
||||||
|
draw_map(player_lx, player_ly); // ridisegna la scena (tile ripristinati)
|
||||||
update_camera();
|
update_camera();
|
||||||
update_player_sprite();
|
update_player_sprite();
|
||||||
SHOW_SPRITES;
|
SHOW_SPRITES;
|
||||||
|
|||||||
Reference in New Issue
Block a user