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