NES TDD

314. Console передаёт маску непрозрачности фона

Подключаем Console.render_framebuffer() к передаче маски непрозрачности фона.

Урок 314 из 356 · tests/chapter_09_sprite_rendering/test_314_console_passes_background_opaque_mask.py

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

emulator/console.py

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

Рендерер спрайтов теперь может применять бит 5 приоритета спрайтов при получении BackgroundOpaqueMask. Шаг 313 добавил вспомогательную функцию уровня PPU:

ppu_background_to_opaque_mask(ppu)

Этот шаг подключает эту функцию к пути рендеринга полного кадра.

Требуемое поведение

Console.render_framebuffer()
    -> render background framebuffer
    -> call ppu_background_to_opaque_mask(self.ppu)
    -> build sprite palettes
    -> select sprite pattern table with PPUCTRL bit 3
    -> call composite_background_and_sprites(..., background_opaque_mask=mask)

Пример фрагмента реализации

from emulator.rendering.ppu_background_renderer import (
    ppu_background_to_framebuffer,
    # --- ADD THIS NEW IMPORT ---
    ppu_background_to_opaque_mask,
    PATTERN_TABLE_0_ADDR,
    PATTERN_TABLE_1_ADDR,
)


def render_framebuffer(self) -> Framebuffer:
    background = self.render_background_framebuffer()

    # --- ADD THIS NEW LINE ---
    background_opaque_mask = ppu_background_to_opaque_mask(self.ppu)

    ...

    return composite_background_and_sprites(
        background=background,
        oam=self.ppu.oam,
        pattern_table=pattern_table,
        sprite_palettes=sprite_palettes,
        # --- ADD THIS NEW LINE ---
        background_opaque_mask=background_opaque_mask,
    )

Важная граница

Console должен оркестрировать вспомогательные функции. Он не должен дублировать извлечение nametable/таблицы паттернов фона, которое относится к ppu_background_renderer.py.

Вне рамок

  • добавление ещё одного алгоритма маски фона
  • изменение ppu_background_to_opaque_mask()
  • sprite 0 hit
  • переполнение спрайтов
  • pygame

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

uv run pytest tests/chapter_09_sprite_rendering/test_314_console_passes_background_opaque_mask.py -v