Глава 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)
Rect хранит четыре числа — и много полезных свойств
Rect(x, y, ширина, высота) дополнительно вычисляет .centerx, .bottom, .top и другие удобные координаты — они пригодятся уже в следующем разделе.Практика: Rect и первый корабль
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально