Глава 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.SRCALPHA20.17
FileNotFoundError на чужом компьютереПуть к ассету не построен через pathlib20.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 не требуется
Открыть практику →