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