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()
- 精灵属性位解码
- 精灵调色板
- 渲染像素
- 精灵 0 命中
- 精灵溢出
- pygame
运行本课
uv run pytest tests/chapter_09_sprite_rendering/test_299_sprite_entry_definition.py -v