Глава 21 · Проект: космический шутер

Что мы построили и как развивать игру дальше

От первого окна в главе 20 до тестируемой, озвученной игры с собственной графикой.

Космический шутер завершён — а вместе с ним закрывается и вторая большая тема курса: полноценная разработка игр на Pygame, от первого окна в главе 20 до тестируемой, озвученной игры с собственной графикой здесь.

Что мы построили в этой главе

  • Полноценную игру из пяти классов: Game, Player, Bullet, Enemy, Explosion — вместо глобальных переменных и списков.
  • Точное движение через Vector2 и delta time — тот же принцип из главы 20, применённый к настоящему проекту с несколькими типами объектов сразу.
  • Таймеры, которые различают автономную симуляцию (появление врагов, анимация — сохраняют остаток времени сверх интервала через while) и реакцию на ввод игрока (интервал между выстрелами — не более одного события за кадр).
  • Столкновения через pygame.sprite.groupcollide() и spritecollide(), с защитой от двойного подсчёта очков и от потери нескольких жизней за одно одновременное столкновение.
  • Явные состояния игры (GameStatus) и контракт перезапуска, сбрасывающий действительно всё переходное состояние — не только счёт.
  • Собственную графику и звук, загруженные один раз, и игру, которую можно проверить автоматически — через внедрение генератора случайных чисел и запуск без окна под «пустым» SDL-драйвером (headless).

Куда развивать проект дальше

Идеи для самостоятельного развития
Больше типов врагов
Собственные паттерны движения (зигзаг, наведение на корабль)
Собственные спрайты и очки
Бонусы и усиления
Временные эффекты через тот же приём таймера, что и неуязвимость
Щит, двойной выстрел, дополнительная жизнь
Боссы
Крупный враг с собственным здоровьем (не одно попадание)
Собственный набор атак
Сохранение рекорда
Запись high_score в файл между запусками (глава 15)
Не только в рамках одной сессии

Следующая глава меняет направление: от локальных игр на Pygame — к веб-разработке на Python. Принципы, освоенные здесь — чёткое разделение обязанностей между классами, явные состояния, тестируемый код — пригодятся и там, просто в других декорациях.