306. Renderizar todos los sprites de OAM

Renderizar los 64 sprites de OAM en datos de framebuffer.

Lección 306 de 356 · tests/chapter_09_sprite_rendering/test_306_render_all_oam_sprites.py

Archivo a actualizar

emulator/rendering/sprite_renderer.py

Por qué existe este paso

Ahora podemos renderizar un SpriteEntry. Dado que OAMDMA llena PPU.oam con 64 entradas de sprite, el siguiente paso es iterar sobre todas las entradas de OAM y renderizar cada sprite en el framebuffer de destino.

Regla importante de prioridad de sprites

Cuando los sprites se superponen, un índice OAM menor tiene mayor prioridad

sprite 0 is in front of sprite 1
sprite 1 is in front of sprite 2
...

Como este renderizador muta un framebuffer, dibujar en orden inverso de OAM

sprite 63 first
...
sprite 0 last

De esta forma, los sprites con índice menor sobrescriben a los de índice mayor en los píxeles superpuestos.

Ejemplo de implementación sugerido

def render_oam_sprites_to_framebuffer(
    framebuffer: Framebuffer,
    oam: bytes | bytearray,
    pattern_table: bytes,
    sprite_palettes: SpritePalettes,
) -> None:
    if len(oam) < OAM_SIZE:
        raise ValueError("OAM must contain 256 bytes")

    for sprite_index in reversed(range(OAM_SPRITE_COUNT)):
        sprite = decode_sprite_entry(oam, sprite_index)
        render_sprite_8x8_to_framebuffer(
            framebuffer,
            sprite,
            pattern_table,
            sprite_palettes,
        )

Fuera del alcance

  • sprite 0 hit
  • sprite overflow
  • política de prioridad/composición del fondo
  • sprites 8x16
  • evaluación de sprites por línea de barrido
  • pygame

Ejecutar esta lección

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