311. Propagar la máscara de opacidad del fondo a través de la canalización de sprites
Propaga la máscara de opacidad del fondo a través de la canalización de renderizado de sprites.
Lección 311 de 356 · tests/chapter_09_sprite_rendering/test_311_thread_background_opaque_mask_through_sprite_pipeline.py
Archivos a actualizar
emulator/rendering/frame_compositor.py
emulator/rendering/sprite_renderer.pyPor qué existe este paso
El paso 310 creó un BackgroundOpaqueMask. Antes de aplicar el comportamiento de prioridad de sprites, primero hacemos que las funciones relevantes acepten y propaguen esa máscara.
Esto mantiene el tutorial incremental
Step 310 -> build the mask
Step 311 -> thread the mask through function signatures
Step 312 -> use the mask to enforce sprite priority bit 5Forma de API requerida
def composite_background_and_sprites(
background: Framebuffer,
oam: bytes | bytearray,
pattern_table: bytes,
sprite_palettes: SpritePalettes,
# --- ADD THIS NEW LINE ---
background_opaque_mask: BackgroundOpaqueMask | None = None,
) -> Framebuffer:
...
render_oam_sprites_to_framebuffer(
framebuffer,
oam,
pattern_table,
sprite_palettes,
# --- ADD THIS NEW LINE ---
background_opaque_mask,
)
...
def render_oam_sprites_to_framebuffer(
framebuffer: Framebuffer,
oam: bytes | bytearray,
pattern_table: bytes,
sprite_palettes: SpritePalettes,
# --- ADD THIS NEW LINE ---
background_opaque_mask: BackgroundOpaqueMask | None = None,
) -> None:
...
render_sprite_8x8_to_framebuffer(
framebuffer,
sprite,
pattern_table,
sprite_palettes,
# --- ADD THIS NEW LINE ---
background_opaque_mask,
)
def render_sprite_8x8_to_framebuffer(
framebuffer: Framebuffer,
sprite: SpriteEntry,
pattern_table: bytes,
sprite_palettes: SpritePalettes,
# --- ADD THIS NEW LINE ---
background_opaque_mask: BackgroundOpaqueMask | None = None,
) -> None:
...Añade también la importación del tipo donde sea necesario
# --- ADD THIS NEW LINE ---
from emulator.rendering.nametable_renderer import BackgroundOpaqueMaskImportante
Este paso todavía no requiere usar la máscara. El siguiente paso añadirá la regla:
if sprite is behind background and background_opaque_mask[pixel] is True:
skip drawing this sprite pixel¿Por qué opcional None? Los tests y pasos del tutorial más antiguos ya llaman a estos ayudantes de renderizado sin una máscara de fondo. Mantener el argumento opcional conserva la compatibilidad hacia atrás mientras evolucionamos la canalización.
Fuera de alcance
- aplicar el bit 5 de prioridad de sprites
- cambiar Console.render_framebuffer()
- construir la máscara a partir del estado de la PPU
- sprite 0 hit
- desbordamiento de sprites
- pygame
Ejecutar esta lección
uv run pytest tests/chapter_09_sprite_rendering/test_311_thread_background_opaque_mask_through_sprite_pipeline.py -v