336. Console использует область просмотра фона

Интегрировать горизонтальные области просмотра фреймбуфера и маски непрозрачности в Console.

Урок 336 из 356 · tests/chapter_13_scrolling/test_336_console_uses_background_viewport.py

Файл для обновления

emulator/console.py

Зачем нужен этот шаг

Шаги 334 и 335 формируют данные фона, учитывающие область просмотра, из текущего состояния прокрутки PPU. Этот шаг собирает эти новые функции внутри Console так, чтобы путь полного кадра использовал и фреймбуфер с применённой прокруткой, и соответствующую ему маску непрозрачности.

Что изменяется

Console.render_background_framebuffer()
    -> keeps the older fixed-background behavior

Console.render_framebuffer()
    -> uses ppu_background_viewport_to_framebuffer(self.ppu)
    -> uses the new viewport opacity mask through a compatibility alias
    -> passes both new results to the existing sprite compositor

Зачем для маски используется псевдоним? В предыдущих уроках имя ppu_background_to_opaque_mask уже используется внутри Console. Импорт новой функции маски области просмотра под этим именем позволяет пути полного кадра использовать новое поведение, не нарушая совместимость с теми предыдущими уроками.

Временное ограничение Super Mario Bros.: не беспокойтесь, если прокрутка пока работает не так, как ожидается. Этот шаг использует только одну позицию прокрутки на весь кадр. Super Mario Bros. в течение одного и того же кадра использует одну позицию для фиксированной строки состояния и другую — для движущейся игровой области. Поэтому после прохождения этого теста игра всё ещё может показывать неподвижный фон, движущуюся строку состояния или иную некорректную прокрутку. Это ожидаемо. В будущих шагах изменения прокрутки будут записываться, а строка состояния и игровой процесс будут отрисовываться как отдельные горизонтальные полосы.

Вне объёма работ

  • изменение планирования попадания нулевого спрайта
  • трассировка записей в $2005
  • отрисовка полос при разделённом экране
  • вертикальная попиксельная прокрутка
  • pygame

Полный пример реализации

# emulator/console.py

from emulator.rendering.ppu_background_renderer import (
    ppu_background_to_framebuffer,
    # --- NEW LINE: FULL-FRAME RENDERING USES THE VIEWPORT ADAPTER ---
    ppu_background_viewport_to_framebuffer,
    # --- UPDATED LINE: USE THE NEW MASK WITH THE EXISTING CONSOLE NAME ---
    ppu_background_viewport_to_opaque_mask as ppu_background_to_opaque_mask,
    PATTERN_TABLE_0_ADDR,
    PATTERN_TABLE_1_ADDR,
)

...

def render_background_framebuffer(self) -> Framebuffer:
    # Keep the older background-only behavior for compatibility.
    return ppu_background_to_framebuffer(self.ppu)

def render_framebuffer(self) -> Framebuffer:
    # --- UPDATED LINE: FULL-FRAME OUTPUT USES THE VIEWPORT FRAMEBUFFER ---
    background = ppu_background_viewport_to_framebuffer(self.ppu)

    # The existing name now refers to the new viewport-mask function.
    background_opaque_mask = ppu_background_to_opaque_mask(self.ppu)

    ...
    # Everything remains the same below this point.

Запустить этот урок

uv run pytest tests/chapter_13_scrolling/test_336_console_uses_background_viewport.py -v