Глава 20 · Разработка игр с Pygame
Как отлаживать игры
Справочник по симптому: большинство багов Pygame-проектов не бросают исключение — игра просто ведёт себя не так, как ожидалось.
По ходу главы вам уже встретилось больше десятка типичных багов Pygame-проектов — по одному-два на каждую новую тему. Здесь они собраны в одну таблицу — как справочник, к которому удобно вернуться, когда что-то в собственном проекте ведёт себя необъяснимо.
| Симптом | Обычная причина | Где подробнее |
|---|---|---|
| Окно помечено "Не отвечает" | pygame.event.get() не вызывается каждый кадр | 20.14 |
| Модули Pygame работают со сбоями с самого начала | Забыт pygame.init() | 20.14 |
| Процессор загружен на 100% без причины | Забыт clock.tick(FPS) | 20.15 |
| Персонаж телепортируется на весь экран | dt не переведён из миллисекунд в секунды | 20.16 |
| По диагонали персонаж быстрее, чем по прямой | Вектор скорости не нормализован | 20.16 |
| На экране остаются "следы" от предыдущих кадров | Забыт screen.fill() в начале кадра | 20.17 |
| Окно показывает только чёрный экран | Забыт pygame.display.flip() | 20.17 |
| Прозрачность картинки пропала | Вызван .convert() вместо .convert_alpha(), или Surface создана без pygame.SRCALPHA | 20.17 |
| FileNotFoundError на чужом компьютере | Путь к ассету не построен через pathlib | 20.19 |
| Персонаж дёргается вместо плавного движения | KEYDOWN использован для непрерывного действия | 20.20 |
| Оружие стреляет очередями от одного нажатия | get_pressed() использован для разового действия | 20.20 |
| Столкновения ощущаются нечестными | Хитбокс не уменьшен относительно рисунка | 20.21 |
| Анимация визуально отстаёт на кадр | Обновление кадра анимации стоит после отрисовки | 20.23 |
| Заметные подтормаживания при каждом звуке | Sound() создаётся заново каждый кадр вместо один раз | 20.24 |
| Игра "телепортируется" после снятия паузы | Пауза проверяется только в render(), не в update() | 20.26 |
Общий метод отладки игр
Почти все баги из этой таблицы объединяет одно: они не бросают исключение и не показывают традиционное сообщение об ошибке — игра просто ведёт себя не так, как ожидалось. Для такого класса багов особенно полезны:
otladka_pechatyu.py
# Временный print() — самый быстрый способ увидеть реальные значения
print(f"dt={{dt:.4f}} x={{x:.1f}} skorost_x={{skorost_x:.1f}}")
# Временная отрисовка хитбокса поверх спрайта — увидеть его границы глазами
pygame.draw.rect(screen, (255, 0, 0), hitbox, width=2)
Отладочная отрисовка — не забыть убрать
Временный
pygame.draw.rect(..., width=2) для хитбокса — один из самых полезных приёмов отладки столкновений, но его легко забыть в готовом проекте. Полезная привычка — держать такие вставки под одним общим флагом вроде OTLADKA = False, чтобы включать и выключать их разом, а не искать по всему файлу.Практика: диагностика по симптому
Проверяется прямо в браузере — установка Pygame не требуется