Мы знаем, что игра — это бесконечная смена кадров. Но пока это были слова: чтобы картина ожила, нужно поставить инструменты и открыть окно, которое ведёт себя как нормальное.
Python и папка проекта
Сначала проверим, что Python у вас вообще есть. Нужна версия 3.15 с python.org. На Windows при установке поставьте галочку Add python.exe to PATH, иначе терминал не найдёт команду python. Откройте терминал и спросите версию.
python --version
Python 3.15.2
На macOS и Linux команда может называться python3 — тогда подставляйте её вместо python везде ниже.
Создайте папку проекта kometa (наша аркада «Комета») и перейдите в неё.
mkdir kometa
cd kometa
Виртуальное окружение
Представьте, что у каждого проекта есть своя коробка с инструментами: библиотеки одного проекта не мешают другому. Без коробок всё свалилось бы в общую кучу, и проекты спорили бы о версиях.
Такая коробка называется виртуальным окружением (venv) — это папка внутри проекта, где живут его пакеты. Создаёт её встроенный модуль venv; папку принято называть .venv.
python -m venv .venv
Теперь окружение нужно активировать — сказать терминалу, что работаем с этой коробкой.
.venv\Scripts\activate
source .venv/bin/activate
В начале строки появится (.venv) — коробка открыта. В каждом новом терминале активацию повторяют.
Windows и политика запуска скриптов
Если PowerShell ругается на запрет запуска скриптов, выполните ту же команду в обычной командной строке cmd.
Ставим pygame-ce
Пакеты ставит программа pip — она скачивает их из каталога PyPI. Мы берём не классический pygame, а живую ветку pygame-ce; в коде она подключается тем же import pygame.
pip install pygame-ce
Проверим встроенным примером — готовой игрой из самой библиотеки.
python -m pygame.examples.aliens
Открылась космическая стрельба — значит, всё настроено. Закройте её крестиком.
Почему pygame-ce, а не pygame
Классический pygame 2.6.1 (2024) собран только до Python 3.13 и на 3.15 не поставится готовым. У pygame-ce сборки есть для 3.10–3.15. Ставьте что-то одно: оба пакета дают модуль pygame и конфликтуют.
Первое окно
Откройте kometa в VS Code и создайте файл main.py. Сначала подключим библиотеку и попросим показать окно.
import pygame
pygame.init()
screen = pygame.display.set_mode((960, 640))
pygame.display.set_caption("Комета")
Разбор по строкам
import pygame— подключаем библиотеку.pygame.init()— запускает внутренние части библиотеки; вызываем один раз в начале.pygame.display.set_mode((960, 640))— создаёт окно 960 на 640 пикселей. Пара чисел в скобках — кортеж (tuple): несколько значений как одно. Ширина и высота передаются одним аргументом, отсюда двойные скобки.screen = ...— функция возвращает поверхность (Surface), прямоугольник из пикселей, который показывает окно. Всё в игре мы рисуем наscreen.pygame.display.set_caption("Комета")— заголовок окна.
Числа и название вынесем в константы — переменные с именами заглавными буквами, которые не меняются: WIDTH = 960, HEIGHT = 640, TITLE = "Комета". Так размер правится в одном месте. Ещё BG_COLOR = (12, 14, 32) — цвет (красный, зелёный, синий), числа от 0 до 255: тёмно-синий, как ночное небо.
Почему окно закрывается или «не отвечает»
Запустите этот фрагмент: окно мигнёт и пропадёт, ведь программа дошла до конца файла и завершилась. Нужен игровой цикл: программа живёт, пока игрок сам не закроет окно.
Но одного цикла мало. Система присылает программе сообщения: мышь двинулась, нажат крестик. Если их не читать, окно получит пометку «Не отвечает». В pygame эти сообщения называются событиями (events) и копятся в очереди событий; каждый кадр мы забираем их все.
import pygame
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
Разбор по строкам
running = True— флаг: пока он истинен, игра идёт.while running:— один проход цикла — один кадр.pygame.event.get()— отдаёт события из очереди и очищает её.for event in ...— перебирает события; текущее лежит вevent.event.type == pygame.QUIT— у события есть тип;pygame.QUITзначит, что игрок нажал крестик.running = False— опускаем флаг, и цикл завершится.pygame.quit()— выключает то, что включилinit().
Осталось показать результат: каждый кадр закрашиваем окно методом fill и вызываем pygame.display.flip() — «показать нарисованное». Считайте, что рисуем за кулисами, а flip раздвигает занавес; подробности — в следующем уроке.
Практика: окно «Кометы»
Соберём всё в kometa/main.py (окружение активно).
import pygame
WIDTH = 960
HEIGHT = 640
TITLE = "Комета"
BG_COLOR = (12, 14, 32)
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(TITLE)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(BG_COLOR)
pygame.display.flip()
pygame.quit()
Разбор по строкам
- Строки 3–6 — константы.
- Строки 8–10 — включаем pygame, создаём и подписываем окно.
- Строки 12–16 — цикл и обработка крестика.
- Строка 18 —
fillкрасит поверхность; стоит внутриwhile, но внеfor: раз за кадр, а не на каждое событие. - Строки 19 и 21 — показываем кадр и выключаем pygame после цикла.
Запустите python main.py. Должно открыться тёмно-синее окно 960 на 640 с заголовком «Комета», которое закрывается крестиком.
Проверьте себя
- В терминале перед приглашением видно
(.venv), аpython -m pygame.examples.aliensоткрывает игру. - Окно с заголовком «Комета» и тёмно-синим (не чёрным) фоном.
- Крестик закрывает окно, ошибок в терминале нет.
- Если убрать цикл событий, окно перестаёт реагировать на крестик — верните всё обратно.
Частые ошибки
ModuleNotFoundError: No module named 'pygame'
Почему: запущен не тот Python, куда ставили пакет.
Что делать: активируйте .venv, повторите pip install pygame-ce и запускайте из той же консоли.
Окно открылось и сразу пропало
Почему: нет цикла while, программа завершилась.
Что делать: добавьте while running.
Окно висит с надписью «Не отвечает», крестик не работает
Почему: события не читаются.
Что делать: поставьте for event in pygame.event.get() внутрь while.
AttributeError: partially initialized module 'pygame' has no attribute 'init'
Почему: файл назван pygame.py и импортируется вместо библиотеки.
Что делать: переименуйте в main.py.
Что важно запомнить
- У каждого проекта своё виртуальное окружение:
python -m venv .venv, затем активация; активировать нужно в каждом новом терминале. - Ставим
pip install pygame-ce, а в коде пишемimport pygame. Пакетыpygameиpygame-ceвместе не ставим. - Окно создаёт
pygame.display.set_mode((WIDTH, HEIGHT)), размер передаётся одной парой чисел. - Без цикла программа сразу завершается, а без чтения событий окно «не отвечает».
- Крестик приходит как событие
pygame.QUIT; в ответ опускаем флагrunning, выходим из цикла и вызываемpygame.quit(). - В каждом кадре: события,
fill,flip.
Дальше заставим цикл работать по-настоящему: часы, 60 кадров в секунду и dt — время кадра в секундах.