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