Таблица рекордов на титрах проявляется собранной
Строки дорисовывались уже после полосового перехода: он копирует страницу акселератором, а тот читает ОЗУ-копию, куда GFX_BANK_SPRITE (NOSHADOW + TRANSPARENT) не пишет. Банк GFX_BANK_TRANSPARENT даёт ту же прозрачность 0xFF, но обновляет и копию, поэтому страницу можно собрать целиком до показа — как offscreen оригинала (draw_full_image + show_hof, и только потом transition_ltr). Проверено в MAME: на промежуточных кадрах перехода строка рекорда видна в уже проявившейся части экрана вместе с логотипом. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3589,10 +3589,11 @@ FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекп
|
||||
титры.
|
||||
|
||||
**Грабля, которая стоила отладки.** Переход копирует страницу
|
||||
акселератором, а тот читает ОЗУ-копию — прозрачный (спрайтовый) блит туда не
|
||||
пишет. Всё, что нарисовано текстом, обязано рисоваться ПОСЛЕ перехода, иначе
|
||||
переезжает только фон (так вышла пустая таблица рекордов, см.
|
||||
[HOF-ENTRY](TASKS_CLOSED.md#hof-entry)).
|
||||
акселератором, а тот читает ОЗУ-копию. `GFX_BANK_SPRITE` (NOSHADOW +
|
||||
TRANSPARENT) в неё не пишет, поэтому переезжал один фон без текста (так вышла
|
||||
пустая таблица рекордов, см. [HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). Всё,
|
||||
что должно проявляться ВМЕСТЕ с фоном, рисовать банком
|
||||
`GFX_BANK_TRANSPARENT` — прозрачность та же, но копия обновляется.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1344,9 +1344,11 @@ make-бита для кода `0x6C`. Скратч-байты — хвост `o
|
||||
`POP_FONT_COLOR`) в ней ЧЁРНАЯ. Текст рисовался, но был не виден.
|
||||
Теперь генератор кладёт в 0x3F золотой 0xB7 оригинала.
|
||||
2. Полосовой переход копирует страницу АКСЕЛЕРАТОРОМ, а тот читает ОЗУ-копию
|
||||
(`gfx_copy_page`: «копируется чистый фон без спрайтов»), куда прозрачный
|
||||
блит текста не пишет. Поэтому на титрах фон переезжал, а строки — нет.
|
||||
Строки теперь рисуются ПОСЛЕ перехода, прямо в видимую страницу.
|
||||
(`gfx_copy_page`: «копируется чистый фон без спрайтов»). `GFX_BANK_SPRITE`
|
||||
— это NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах
|
||||
переезжал один фон без строк. Лечится банком `GFX_BANK_TRANSPARENT`
|
||||
(0x58): та же прозрачность 0xFF, но с записью в копию — страница
|
||||
собирается ЦЕЛИКОМ до показа, как offscreen оригинала.
|
||||
|
||||
**Что появилось попутно.**
|
||||
|
||||
|
||||
@@ -285,16 +285,18 @@ static void hof_edit_bar(uint8_t row)
|
||||
bar(HOF_EDIT_LEFT, top, HOF_EDIT_RIGHT, top + HOF_ROW_H - 1);
|
||||
}
|
||||
|
||||
/* Строки таблицы в ТЕКУЩУЮ draw-страницу. Отделены от фона потому, что
|
||||
* полосовой переход НЕ ПЕРЕНОСИТ их: gfx_copy_page работает акселератором,
|
||||
* а тот читает ОЗУ-копию страницы, куда прозрачный (спрайтовый) блит не
|
||||
* пишет. Поэтому на титрах строки рисуются уже после перехода, прямо в
|
||||
* видимую страницу. */
|
||||
/* Строки таблицы в ТЕКУЩУЮ draw-страницу.
|
||||
*
|
||||
* БАНК ЗДЕСЬ TRANSPARENT, А НЕ SPRITE. Полосовой переход копирует страницу
|
||||
* акселератором, а тот читает ОЗУ-копию (gfx_copy_page); SPRITE — это
|
||||
* NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах
|
||||
* переезжал бы один фон без строк. TRANSPARENT даёт ту же прозрачность
|
||||
* 0xFF, но обновляет и копию, поэтому таблица проявляется уже собранной. */
|
||||
static void hof_draw_rows(uint8_t edit_row)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
gfx_set_bank(GFX_BANK_SPRITE);
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
pop_text_map();
|
||||
for (i = 0; i < HOF_COUNT; i++) {
|
||||
char value[12];
|
||||
@@ -333,7 +335,7 @@ static void hof_edit_draw(uint8_t row, const char *name, uint8_t cursor)
|
||||
|
||||
gfx_set_draw_page(gfx_get_visible_page());
|
||||
hof_edit_bar(row);
|
||||
gfx_set_bank(GFX_BANK_SPRITE);
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
pop_text_map();
|
||||
/* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */
|
||||
if (name[0]) {
|
||||
@@ -518,12 +520,11 @@ uint8_t pop_hof_show_title(void) __banked
|
||||
hof_load();
|
||||
if (!hof_has_entries()) return 0;
|
||||
page = pop_screen_begin();
|
||||
/* Ни fade, ни смены палитры: экран проявляется полосами прямо поверх
|
||||
* credits, на той же story.pal (seg000:2063). Переход несёт ТОЛЬКО
|
||||
* фон — строки дорисовываются следом в видимую страницу. */
|
||||
if (pop_intro_hof_bg(page) != 0) return 0;
|
||||
/* Страница собирается ЦЕЛИКОМ до показа — как offscreen оригинала:
|
||||
* draw_full_image + show_hof, и только потом transition_ltr
|
||||
* (seg000:2063). Ни fade, ни смены палитры: экран проявляется прямо
|
||||
* поверх credits, на той же story.pal. */
|
||||
if (hof_page_build(page, HOF_NO_ROW) != 0) return 0;
|
||||
pop_screen_present_ltr();
|
||||
gfx_set_draw_page(gfx_get_visible_page());
|
||||
hof_draw_rows(HOF_NO_ROW);
|
||||
return hof_wait_frames(HOF_TITLE_TICKS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user