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.pyPor 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, 255Ejemplo 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