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

План игры и подготовка проекта

Самая крупная игра книги — все части уже знакомы по главе 20, здесь они впервые работают вместе.

Этот проект — самая крупная игра книги: корабль игрока, враги, спускающиеся сверху, стрельба, уничтожение врагов, счёт очков, жизни, растущая сложность и полноценный конец игры с перезапуском. Все составные части уже знакомы по главе 20 — Rect, colliderect(), спрайты, состояния игры, delta time — здесь они впервые работают вместе, в одном учебном проекте.

Реальный кадр готовой игры: синий корабль внизу, несколько врагов разных типов и пуль на игровом поле, HUD со счётом и жизнями сверху
Реальный кадр финальной версии игры — то, что получится в итоге этой главы.

Импортируем необходимые модули

importy.py
import random
from dataclasses import dataclass
from enum import Enum, auto
from pathlib import Path

import pygame

dataclasses (глава 14) и enum (глава 18) здесь не случайны: класс-описание типа врага и явные состояния игры — тот же приём, что SostoyanieIgry в разделе 20.25.

Инициализируем всё необходимое

inicializaciya.py
SHIRINA, VYSOTA = 480, 720
FPS = 60

pygame.init()
screen = pygame.display.set_mode((SHIRINA, VYSOTA))
pygame.display.set_caption("Космический шутер")
clock = pygame.time.Clock()
shrift = pygame.font.SysFont(None, 28)
pygame.font — тот же модуль, что и в главе 20
pygame.font.SysFont(None, 28) создаёт шрифт системным по умолчанию, размером 28 — понадобится для табло счёта в разделе 21.5. Полная финальная версия использует сразу три размера шрифта — обычный, крупный (заголовки экранов) и мелкий (подписи).

План проекта

Прежде чем писать код, полезно увидеть карту того, что получится в итоге. Финальная версия (раздел 21.25) состоит из пяти классов с чёткими обязанностями:

Пять классов финальной игры
Game
Владеет всем состоянием игры
Игровой цикл: события → ввод → обновление → отрисовка
Переключает состояния MENU/PLAYING/PAUSED/GAME_OVER
Player
Позиция как Vector2 (раздел 21.11)
Движение, ограниченное игровым полем
Интервал между выстрелами и таймер неуязвимости
Bullet
Летит вверх с постоянной скоростью
Удаляет себя за пределами игрового поля
Enemy
Летит вниз с индивидуальной скоростью
Несёт очки за уничтожение
Explosion
Анимация из нескольких кадров
Удаляет себя после последнего кадра

Этот раздел и разделы 21.2–21.8 повторяют исторический порядок изложения из бумажной книги и намеренно начинают проще, чем финальная версия — с обычных функций и списков, как в главе 20. С раздела 21.9 книга объясняет, как и почему этот код вырастает в архитектуру на классах.

Практика: импорт и инициализация
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →