314. Console 传递背景不透明掩码

让 Console.render_framebuffer() 传递背景不透明度掩码。

314 / 356 · tests/chapter_09_sprite_rendering/test_314_console_passes_background_opaque_mask.py

需要更新的文件

emulator/console.py

为什么需要这一步

精灵渲染器现在可以在接收到 BackgroundOpaqueMask 时应用精灵优先级第 5 位。步骤 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 应当负责编排各个辅助函数,而不应重复实现本应属于 ppu_background_renderer.py 的背景名称表/图案表提取逻辑。

本步骤范围之外

  • 添加另一种背景掩码算法
  • 更改 ppu_background_to_opaque_mask()
  • 精灵 0 命中
  • 精灵溢出
  • pygame

运行本课

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