300. Decodificar una entrada de sprite

Decodificar una entrada de sprite a partir de bytes de OAM.

Lección 300 de 356 · tests/chapter_09_sprite_rendering/test_300_decode_sprite_entry.py

Archivo a actualizar

emulator/rendering/sprite_renderer.py

Por qué existe este paso

El paso anterior definió SpriteEntry. Ahora añadimos el pequeño decodificador que convierte los bytes brutos de OAM de la PPU en un SpriteEntry.

Disposición bruta de OAM

sprite 0 -> bytes 0, 1, 2, 3
sprite 1 -> bytes 4, 5, 6, 7
...
sprite 63 -> bytes 252, 253, 254, 255

Ejemplo de implementación sugerido

def decode_sprite_entry(oam: bytes | bytearray, sprite_index: int) -> SpriteEntry:
    if len(oam) < OAM_SIZE:
        raise ValueError("OAM must contain 256 bytes")

    if not 0 <= sprite_index < OAM_SPRITE_COUNT:
        raise ValueError("sprite_index must be in range 0..63")

    base = sprite_index * BYTES_PER_SPRITE

    return SpriteEntry(
        y=oam[base],
        tile_index=oam[base + 1],
        attributes=oam[base + 2],
        x=oam[base + 3],
    )

Detalle importante de la NES

El byte Y bruto tiene una semántica de renderizado especial en el hardware real. Los sprites aparecen una línea de rastreo por debajo del valor Y almacenado. No lo ajustes en este decodificador. Esta función devuelve solo los datos brutos de OAM.

Fuera de alcance

  • Decodificación de bits de atributos de sprite
  • Paletas de sprites
  • Renderizado de píxeles
  • Sprite 0 hit
  • Desbordamiento de sprites
  • pygame

Ejecutar esta lección

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