NES TDD

307. Композитинг фона и спрайтов

Выполнить композитинг фона и спрайтов в один фреймбуфер.

Урок 307 из 356 · tests/chapter_09_sprite_rendering/test_307_composite_background_and_sprites.py

Создаваемый файл

emulator/rendering/frame_compositor.py

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

Эмулятор теперь может отрисовывать данные фреймбуфера фона и отрисовывать спрайты OAM во фреймбуфер. Этот шаг объединяет эти пути:

background framebuffer + OAM sprites -> final framebuffer

Важное проектное решение

Функция композитинга должна возвращать новый Framebuffer. Она не должна изменять исходный фреймбуфер фона. Это делает функцию проще для анализа и проще для тестирования.

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

from emulator.rendering.framebuffer import Framebuffer
from emulator.rendering.palette_ram import SpritePalettes
from emulator.rendering.sprite_renderer import render_oam_sprites_to_framebuffer


def composite_background_and_sprites(
    background: Framebuffer,
    oam: bytes | bytearray,
    pattern_table: bytes,
    sprite_palettes: SpritePalettes,
) -> Framebuffer:
    framebuffer = Framebuffer(
        width=background.width,
        height=background.height,
        pixels=list(background.pixels),
    )

    render_oam_sprites_to_framebuffer(
        framebuffer,
        oam,
        pattern_table,
        sprite_palettes,
    )

    return framebuffer

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

  • приоритет спрайтов позади фона
  • попадание спрайта 0
  • переполнение спрайтов
  • спрайты 8x16
  • интеграция Console
  • pygame

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

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