NES TDD

299. Определение записи спрайта

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

Урок 299 из 356 · tests/chapter_09_sprite_rendering/test_299_sprite_entry_definition.py

Файл для создания

emulator/rendering/sprite_renderer.py

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

OAMDMA уже копирует 256 байт в PPU.oam. Прежде чем рендерить спрайты, нужна небольшая модель данных для одной записи спрайта.

Что такое OAM? OAM означает Object Attribute Memory. Это внутренняя память спрайтов PPU:

64 sprites * 4 bytes = 256 bytes

Каждая запись спрайта занимает четыре байта

byte 0: Y position
byte 1: tile index
byte 2: attributes
byte 3: X position

Этот первый шаг рендеринга спрайтов только создаёт константы и датакласс SpriteEntry. Он ещё не декодирует данные из OAM и не рендерит пиксели.

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

from dataclasses import dataclass


OAM_SPRITE_COUNT = 64
BYTES_PER_SPRITE = 4
OAM_SIZE = OAM_SPRITE_COUNT * BYTES_PER_SPRITE


@dataclass(frozen=True)
class SpriteEntry:
    y: int
    tile_index: int
    attributes: int
    x: int

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

"OAMDMA means sprites are visible."

Нет. OAMDMA лишь заполняет PPU.oam. Рендеринг этих записей в пиксели — это более поздний шаг главы 09.

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

  • decode_sprite_entry()
  • декодирование битов атрибутов спрайта
  • палитры спрайтов
  • рендеринг пикселей
  • sprite 0 hit
  • переполнение спрайтов
  • pygame

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

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