307. Composición de fondo y sprites

Componer fondo y sprites en un solo framebuffer.

Lección 307 de 356 · tests/chapter_09_sprite_rendering/test_307_composite_background_and_sprites.py

Archivo a crear

emulator/rendering/frame_compositor.py

Por qué existe este paso

El emulador ahora puede renderizar datos de framebuffer de fondo y renderizar sprites de OAM en un framebuffer. Este paso combina ambos caminos:

background framebuffer + OAM sprites -> final framebuffer

Decisión de diseño importante

El compositor debe devolver un nuevo Framebuffer. No debe mutar el framebuffer de fondo original. Esto hace que la función sea más fácil de razonar y más fácil de probar.

Ejemplo de implementación sugerido

from emulator.rendering.framebuffer import Framebuffer
from emulator.rendering.palette_ram import SpritePalettes
from emulator.rendering.sprite_renderer import render_oam_sprites_to_framebuffer


def composite_background_and_sprites(
    background: Framebuffer,
    oam: bytes | bytearray,
    pattern_table: bytes,
    sprite_palettes: SpritePalettes,
) -> Framebuffer:
    framebuffer = Framebuffer(
        width=background.width,
        height=background.height,
        pixels=list(background.pixels),
    )

    render_oam_sprites_to_framebuffer(
        framebuffer,
        oam,
        pattern_table,
        sprite_palettes,
    )

    return framebuffer

Fuera del alcance

  • prioridad de sprite detrás del fondo
  • sprite 0 hit
  • sprite overflow
  • sprites 8x16
  • integración con Console
  • pygame

Ejecutar esta lección

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