$ sudo teach IT
Модуль 1 · Первое окно · Урок 1.1

Что такое Pygame

Вы поймёте, как устроена любая 2D-игра, что такое Pygame и pygame-ce, и что мы с вами построим за этот курс.

Обзор~15 минутНовичок

Вы играли в десятки игр, но вряд ли задумывались, что происходит внутри. Чтобы сделать свою, надо понять, как программа может «жить» на экране и в каждый момент реагировать на игрока. С этого и начнём.

Игра — это мультфильм, который слушает игрока

Мультфильм состоит из множества картинок: в каждой герой сдвинут чуть дальше, чем в предыдущей. Если быстро их листать, глаз видит плавное движение. Игра работает так же, только картинки рисует ваша программа, и делает это обычно 60 раз в секунду.

Одна такая картинка называется кадром. Сколько кадров программа успевает показать за секунду, измеряют в FPS (frames per second, «кадров в секунду»). У нашей игры будет 60 FPS, то есть на кадр уйдёт примерно 0,016 секунды.

Но в отличие от мультфильма игра слушает зрителя. Между кадрами она смотрит, какие клавиши нажаты, и учитывает это в следующей картинке: нажали стрелку влево — в следующем кадре корабль нарисован чуть левее. Поэтому игра не ждёт нажатия, как функция input(), которая замирает, пока вы что-нибудь не введёте. Мир живёт сам: метеоры падают, даже если вы ничего не трогаете.

Бесконечное повторение одних и тех же шагов называют игровым циклом (game loop).

Что делает цикл в каждом кадре

Шагов четыре. Имена функций ниже придуманы для наглядности: настоящий код появится в следующих уроках.

Python · фрагмент
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 и откроем первое окно.

На следующий урок