NES TDD

301. Определение атрибутов спрайта

Определить модель данных атрибутов спрайта.

Урок 301 из 356 · tests/chapter_09_sprite_rendering/test_301_sprite_attribute_definition.py

Изменяемый файл

emulator/rendering/sprite_renderer.py

Зачем нужен этот шаг

Каждая запись SpriteEntry содержит один исходный байт атрибутов. Прежде чем отрисовывать спрайты, нам нужны имена для значимых битов и небольшой dataclass для декодированного значения.

Байт атрибутов спрайта 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

Предлагаемый пример реализации

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

Распространённое заблуждение

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

Нет. Байты таблицы атрибутов фона выбирают палитры фона для областей тайлов. Атрибуты спрайта задаются для каждого спрайта отдельно и находятся в байте 2 OAM.

Вне рамок этого шага

  • decode_sprite_attributes()
  • вспомогательная функция для палитровой RAM спрайтов
  • отрисовка пикселей
  • попадание спрайта 0
  • переполнение спрайтов
  • pygame

Запустить этот урок

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