Вы играли в десятки игр, но вряд ли задумывались, что происходит внутри. Чтобы сделать свою, надо понять, как программа может «жить» на экране и в каждый момент реагировать на игрока. С этого и начнём.
Игра — это мультфильм, который слушает игрока
Мультфильм состоит из множества картинок: в каждой герой сдвинут чуть дальше, чем в предыдущей. Если быстро их листать, глаз видит плавное движение. Игра работает так же, только картинки рисует ваша программа, и делает это обычно 60 раз в секунду.
Одна такая картинка называется кадром. Сколько кадров программа успевает показать за секунду, измеряют в FPS (frames per second, «кадров в секунду»). У нашей игры будет 60 FPS, то есть на кадр уйдёт примерно 0,016 секунды.
Но в отличие от мультфильма игра слушает зрителя. Между кадрами она смотрит, какие клавиши нажаты, и учитывает это в следующей картинке: нажали стрелку влево — в следующем кадре корабль нарисован чуть левее. Поэтому игра не ждёт нажатия, как функция input(), которая замирает, пока вы что-нибудь не введёте. Мир живёт сам: метеоры падают, даже если вы ничего не трогаете.
Бесконечное повторение одних и тех же шагов называют игровым циклом (game loop).
Что делает цикл в каждом кадре
Шагов четыре. Имена функций ниже придуманы для наглядности: настоящий код появится в следующих уроках.
while True:
read_input() # 1. что нажал игрок
update_world() # 2. сдвинуть объекты, проверить столкновения
draw_frame() # 3. нарисовать кадр
wait_next_frame() # 4. подождать до следующего кадра
Разбор по строкам
while True:— повторять бесконечно, пока игра не закончится. Один оборот цикла — один кадр.read_input()— узнать, какие клавиши нажаты и не закрыл ли игрок окно.update_world()— пересчитать положение всего в игре. Это логика — правила и расчёты.draw_frame()— показать результат на экране. Это отрисовка.wait_next_frame()— сделать паузу, чтобы кадров было ровно столько, сколько мы хотим.
Логика и отрисовка — два разных дела
Сначала мы решаем, где что находится, и только потом рисуем. Принцип «логика отдельно от отрисовки» — главный приём курса: расчёты можно проверять без окна, прямо в задачах на сайте.
Что такое Pygame
Нарисовать окно, поймать клавишу, проиграть звук — на каждой операционной системе это делается по-своему. Чтобы не писать код отдельно для Windows, macOS и Linux, есть готовые наборы инструментов.
Pygame — такая библиотека для Python (библиотека — чужой готовый код, который вы подключаете). Она открывает окно, рисует фигуры и картинки, читает клавиатуру и мышь, проигрывает звуки и отмеряет время. Под капотом работает библиотека SDL (Simple DirectMedia Layer): она общается с видеокартой, клавиатурой и звуковой картой, а Pygame делает этот разговор удобным для Python. Подключается одной строкой import pygame.
Pygame и pygame-ce
Классический Pygame развивается медленно, и часть разработчиков продолжила его отдельным проектом — pygame-ce (Community Edition, «версия сообщества»). Там чинят ошибки и вовремя выпускают сборки под новые версии Python.
В коде ничего не меняется: по-прежнему import pygame. Другим будет только имя пакета при установке — pygame-ce. Мы работаем на Python 3.15, и примеры курса подойдут обеим версиям.
Не ставьте пакет pygame на Python 3.15
Готовые сборки классического pygame есть только для более старых версий Python. Нужная вам команда — pip install pygame-ce.
Что умеет и чего не умеет
Pygame хорош для двухмерных игр: аркад, платформеров, головоломок, прототипов. Он удобен для учёбы: видно, из чего состоит игра.
Но это не большой движок с визуальным редактором, где уровни собирают мышкой, и не инструмент для трёхмерной графики. Для таких задач есть Unity — после нашего курса вам будет проще в него войти, ведь кадр и цикл там те же.
Что мы построим: аркада «Комета»
Внизу окна 960×640 пикселей летает корабль: стрелки или WASD двигают его, Пробел стреляет. Сверху падают метеоры. Сбили метеор — +10 очков; столкнулись — минус одна жизнь из трёх и полторы секунды неуязвимости, пока корабль мигает. Падают и кристаллы: поймали — +25. Каждые 200 очков наступает новый уровень, и метеоры летят быстрее и чаще.
Вокруг будет настоящая оболочка: меню, пауза, экран «Игра окончена», звук, рекорд между запусками и сборка в один файл для друзей.
Как устроен курс
Семь модулей: окно и игровой цикл, движение корабля, спрайты и группы, столкновения и очки, картинки и звуки, меню и уровни, рекорд и сборка. Игра будет расти в вашей папке kometa/.
Задачи на сайте проверяются в песочнице без окна и без Pygame. Это следствие того же правила: расчёты (куда сдвинуть, пересеклись ли, сколько очков) мы вынесем в отдельный файл logic.py на обычном Python и проверим там, а окно проверите глазами на своём компьютере.
Практика
Писать код в этом уроке не нужно. Возьмите любую знакомую игру и разберите её как цикл кадров. Ничего запускать не надо.
Проверьте себя
- Какие клавиши или кнопки игра читает на шаге «узнать, что сделал игрок»?
- Что в ней логика, а что отрисовка?
- Что двигается само, даже если игрок ничего не нажимает?
- Как называется пакет для
pipи какой строкой он подключается в коде?
Частые ошибки
«Игра ждёт нажатия, как input()»
Что видно: игра представляется программой, которая встаёт и спрашивает, что делать дальше. Почему не так: тогда метеоры замерли бы. Как правильно: цикл крутится всегда, а клавиши проверяются в каждом кадре.
«Pygame — это движок с редактором уровней»
Что видно: ожидание, что игру можно собрать мышкой. Почему не так: это набор инструментов для Python, уровни и правила пишутся кодом. Как правильно: считать его конструктором, из которого вы сами собираете игру.
Установка пакета pygame на Python 3.15
Что видно: pip долго собирает пакет и падает, либо не находит версию. Почему: готовых сборок классического пакета для новых Python нет. Как исправить: pip install pygame-ce, а импорт остаётся import pygame.
Что важно запомнить
- Игра — это игровой цикл: в каждом кадре прочитать ввод, пересчитать мир, нарисовать, подождать.
- Кадр — одна картинка; FPS — кадров в секунду. У нас 60.
- Pygame — библиотека Python для 2D-игр поверх SDL; pygame-ce — её живая ветка (ставится
pygame-ce, импортируетсяpygame). - Логика отдельно от отрисовки — главный приём курса.
- Мы построим аркаду «Комета» с метеорами, кристаллами, жизнями, уровнями, меню, звуком и рекордом.
Дальше установим Python и pygame-ce и откроем первое окно.