301. Definición de atributos de sprite

Definir el modelo de datos de atributos de sprite.

Lección 301 de 356 · tests/chapter_09_sprite_rendering/test_301_sprite_attribute_definition.py

Archivo a actualizar

emulator/rendering/sprite_renderer.py

Por qué existe este paso

Cada SpriteEntry contiene un byte de atributos en crudo. Antes de renderizar sprites, necesitamos nombres para los bits relevantes y una pequeña dataclass para el significado decodificado.

Byte de atributos de sprite en la NES

bits 0-1: sprite palette ID
bits 2-4: unused / ignored for now
bit 5: priority behind background
bit 6: horizontal flip
bit 7: vertical flip

Ejemplo de implementación sugerido

SPRITE_PALETTE_ID_MASK = 0b0000_0011
SPRITE_IS_BEHIND_BACKGROUND = 1 << 5
SPRITE_FLIP_HORIZONTAL = 1 << 6
SPRITE_FLIP_VERTICAL = 1 << 7


@dataclass(frozen=True)
class SpriteAttributes:
    palette_id: int
    is_behind_background: bool
    flip_horizontal: bool
    flip_vertical: bool

Concepto erróneo frecuente

"Sprite attributes are the same as background attribute table bytes."

No. Los bytes de la tabla de atributos del fondo seleccionan paletas de fondo para regiones de tiles. Los atributos de sprite son por sprite y residen en el byte 2 de OAM.

Fuera del alcance

  • decode_sprite_attributes()
  • helper de paleta de sprite en RAM
  • renderizado de píxeles
  • sprite 0 hit
  • sprite overflow
  • pygame

Ejecutar esta lección

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