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

Игровой цикл и корабль игрока

План того, что должно происходить на каждом кадре — и первый персонаж игры.

Игровой цикл

Как и в главе 20, цикл — сердце игры. На этот раз он на каждом кадре обновляет сразу несколько вещей: положение корабля, врагов, пуль — и проверяет столкновения между ними. С самого первого кадра цикл считает delta time (сокращённо dt) — раздел 20.16 уже объяснял, зачем: скорость, заданная в пикселях в секунду и применённая через dt, не зависит от частоты кадров конкретного компьютера:

igrovoj_cikl_plan.py
while rabotaet:
    dt = clock.tick(FPS) / 1000.0   # секунд с прошлого кадра

    # 1. обработать события (выход, пауза, выстрел по нажатию)
    # 2. обработать зажатые клавиши (движение корабля, удержание огня)
    # 3. обновить положение врагов и пуль по dt, проверить столкновения
    # 4. нарисовать всё заново
dt здесь с самого начала, а не добавляется позже
Мини-проект прыгающего мяча (раздел 20.5) начинался с движения «пикселей за кадр» и переходил на delta time только в разделе 20.16. Здесь так делать не будем: раз глава 20 уже объяснила, почему движение «пикселей за кадр» зависит от чужого железа, космический шутер с первого движущегося объекта считает скорость в пикселях в секунду (px/s) и применяет её через dt.

Создаём космический корабль

Вместо отдельных переменных x, y корабля удобно использовать pygame.Rect — он сразу хранит позицию и размер вместе и понадобится для проверки столкновений:

korabl.py
KORABL_SHIRINA, KORABL_VYSOTA = 44, 44

korabl = pygame.Rect(
    SHIRINA // 2 - KORABL_SHIRINA // 2,
    VYSOTA - KORABL_VYSOTA - 20,
    KORABL_SHIRINA,
    KORABL_VYSOTA,
)

# в игровом цикле:
pygame.draw.rect(screen, (80, 220, 120), korabl)
Реальное окно: крупный план синего треугольного корабля с оранжевым свечением двигателя внизу
Финальная версия рисует корабль собственным спрайтом (раздел 21.10), а не прямоугольником — но Rect остаётся его хитбоксом.
Rect хранит четыре числа — и много полезных свойств
Rect(x, y, ширина, высота) дополнительно вычисляет .centerx, .bottom, .top и другие удобные координаты — они пригодятся уже в следующем разделе.
Практика: Rect и первый корабль
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →