NES TDD

309. Main использует полный фреймбуфер

Создать main.py из main_only_background.py и использовать Console.render_framebuffer().

Урок 309 из 356 · tests/chapter_09_sprite_rendering/test_309_main_uses_full_framebuffer.py

Задействованные файлы

main_only_background.py
main.py

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

main_only_background.py сохраняет предыдущий сценарий ручного запуска, который отображал только фреймбуфер фона. Для этого шага скопируйте этот файл в main.py, а затем примените в нём изменения для отрисовки полного кадра.

Теперь Console предоставляет render_framebuffer(), который возвращает фон и спрайты в одном чистом Framebuffer. Новый main.py должен использовать этот путь отрисовки полного кадра вместо более старой вспомогательной функции, работающей только с фоном.

Файл-шаблон main_only_background.py отображает:

console.render_background_framebuffer()

После копирования его в main.py и применения этого шага main.py отображает:

console.render_framebuffer()

Это позволяет ручному сценарию pygame показывать спрайты вроде Mario/врагов/предметов, когда текущее состояние PPU содержит корректные данные OAM, CHR и палитр спрайтов.

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

cp main_only_background.py main.py

Затем измените main.py так, чтобы эта строка:

framebuffer = console.render_background_framebuffer()

стала:

framebuffer = console.render_framebuffer()

Сделайте это и перед созданием окна pygame, и после каждого шага кадра.

Важное правило сохранения

Не удаляйте main_only_background.py. Более старые тесты руководства используют его как стабильную историческую контрольную точку для сценария, отображающего только фон.

Известное визуальное ограничение

Спрайты могут некорректно отображаться перед трубами/трубками. На данный момент это ожидаемо, потому что бит 5 приоритета спрайт/фон декодирован, но ещё не применяется. Следующая запланированная работа — маска непрозрачности фона и композитинг с учётом приоритета.

Команда для ручного запуска

uv run python main.py

Ожидаемое поведение при ручном запуске

Окно pygame должно по-прежнему показывать фон, а спрайты теперь должны появляться. Визуальный приоритет пока может быть неверным. Производительность пока может быть низкой, потому что текущая вспомогательная функция отрисовки pygame намеренно проста.

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

  • маска непрозрачности фона
  • поведение приоритета спрайт/фон
  • попадание спрайта 0
  • переполнение спрайтов
  • оптимизация быстрой загрузки фреймбуфера
  • вызов main() из pytest

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

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