Pygame: основы работы и первая игра на Python

Pygame: основы работы и первая игра на Python Полезное

Pygame — это библиотека Python для создания 2D-игр и мультимедийных приложений с графикой, звуком и обработкой ввода. Она дает готовые инструменты для окна, рисования, клавиатуры и мыши, поэтому подходит для первых игровых проектов. Ниже разбираю установку, игровой цикл, поверхности и спрайты, события и отрисовку — с рабочим примером и частыми ошибками новичка.

Что такое Pygame и когда его брать

Pygame — надстройка над библиотекой SDL. Это не движок с редактором сцен, а набор модулей: окно (display), рисование (draw), картинки (image), звук (mixer), шрифты (font), события (event).

Библиотека вышла в 2000 году (автор Пит Шиннерс) и развивается до сих пор. Актуальная ветка на 2026 год — 2.6.x; есть также форк pygame-ce (Community Edition) с более быстрыми исправлениями. Для новичка версии взаимозаменяемы: код из статьи работает в любой.

Pygame — кроссплатформенный (Windows, macOS, Linux) и с открытым кодом. Он хорош для небольших 2D-проектов: аркад, платформеров, головоломок. Для 3D и крупных коммерческих игр берут Unity или Godot — Pygame для этого не предназначен.

Установка

Ставится через pip. Рекомендую делать это внутри виртуального окружения проекта:

python -m venv venv
source venv/bin/activate      # Windows: venv\Scripts\activate
pip install pygame

Проверить установку можно так — команда выведет номер версии:

python -m pygame.examples.aliens

Эта команда запускает демо-игру из комплекта. Если открылось окно с игрой — библиотека установлена корректно.

Игровой цикл: минимальный рабочий пример

Игровой цикл (game loop) — это бесконечный цикл, который на каждом кадре делает три вещи: читает события, обновляет состояние игры, перерисовывает экран. Без него окно откроется и сразу зависнет.

Вот полный работающий пример — окно 640×480 с красным кругом в центре:

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Моя первая игра")
clock = pygame.time.Clock()

running = True
while running:
    for event in pygame.event.get():        # 1. читаем события
        if event.type == pygame.QUIT:
            running = False

    screen.fill((30, 30, 30))               # 2. заливаем фон темно-серым
    pygame.draw.circle(screen, (255, 80, 80), (320, 240), 40)  # рисуем круг

    pygame.display.flip()                   # 3. показываем готовый кадр
    clock.tick(60)                          # ограничиваем 60 кадрами в секунду

pygame.quit()

Что происходит по шагам:

  • pygame.init() — готовит модули к работе, вызывать до создания окна.
  • set_mode((640, 480)) — создает окно и возвращает главную поверхность (Surface), на которой мы рисуем.
  • screen.fill(...) очищает экран перед новым кадром, flip() выводит нарисованное на экран.
  • clock.tick(60) — удерживает около 60 кадров в секунду, иначе цикл грузит процессор без ограничений.

Результат: откроется окно «Моя первая игра» с темно-серым фоном и красным кругом посередине; закрывается по клику на крестик.

Поверхности и спрайты

Поверхность (Surface) — это прямоугольная область с пикселями в памяти. Экран из примера выше — тоже Surface. Любую картинку или фигуру сначала рисуют на поверхности, потом переносят на экран методом blit.

player = pygame.Surface((50, 50))     # пустая поверхность 50x50
player.fill((80, 160, 255))           # заливаем голубым
screen.blit(player, (100, 100))       # рисуем ее в точке (100, 100)

Начало координат — в левом верхнем углу окна: X растет вправо, Y — вниз.

Готовое изображение из файла загружают через pygame.image.load. Вызов convert_alpha() ускоряет отрисовку и сохраняет прозрачность PNG (для непрозрачных картинок — convert()):

hero = pygame.image.load("hero.png").convert_alpha()
screen.blit(hero, (100, 100))

Когда объектов много, удобен класс pygame.sprite.Sprite. Спрайт хранит свое изображение (image) и положение (rect), а группы спрайтов рисуются одной командой:

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((80, 160, 255))
        self.rect = self.image.get_rect(topleft=(x, y))

players = pygame.sprite.Group(Player(100, 100))
players.draw(screen)     # рисует все спрайты группы

Обработка событий

События — это действия пользователя и системы: закрытие окна, нажатие клавиш, клики мыши. Pygame складывает их в очередь, а мы читаем ее через pygame.event.get().

Событие Когда возникает Как проверить
pygame.QUIT закрытие окна event.type == pygame.QUIT
pygame.KEYDOWN нажата клавиша event.key == pygame.K_SPACE
pygame.KEYUP клавиша отпущена event.key == pygame.K_LEFT
pygame.MOUSEBUTTONDOWN клик мышью event.button, event.pos

Разовые действия (выстрел, прыжок, пауза) удобно ловить через KEYDOWN. А для непрерывного движения нужны не события, а опрос зажатых клавиш через pygame.key.get_pressed():

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    x -= 5                    # едем влево, пока клавиша зажата
if keys[pygame.K_RIGHT]:
    x += 5

Разница важна: KEYDOWN срабатывает один раз на нажатие, а get_pressed() возвращает состояние на текущем кадре — объект будет двигаться, пока клавишу держат.

Отрисовка: фигуры, цвета, текст

Функции рисования лежат в модуле pygame.draw. Основные:

pygame.draw.line(screen, (255, 255, 255), (0, 0), (200, 200), 3)   # линия
pygame.draw.rect(screen, (0, 200, 0), (50, 50, 120, 80))           # прямоугольник
pygame.draw.circle(screen, (255, 0, 0), (300, 200), 40)            # круг
pygame.draw.polygon(screen, (200, 200, 0), [(400, 100), (450, 200), (350, 200)])

У фигур с контуром последний параметр — толщина линии. Если задать 0 или не указывать, фигура заливается сплошным цветом.

Цвет задается моделью RGB — тройкой чисел от 0 до 255 (красный, зеленый, синий): белый — (255, 255, 255), черный — (0, 0, 0), красный — (255, 0, 0). Четвертое число задает прозрачность (альфа).

Текст рисуют в два шага: создают шрифт, затем «рендерят» строку в поверхность и переносят на экран:

font = pygame.font.SysFont("arial", 32)
text = font.render("Счет: 10", True, (255, 255, 255))   # True = сглаживание
screen.blit(text, (50, 50))

Три частые ошибки новичка

Ошибка 1. Создание окна до инициализации.

import pygame
screen = pygame.display.set_mode((640, 480))   # забыли pygame.init()

Результат:

pygame.error: video system not initialized

Исправление — вызвать pygame.init() перед set_mode().

Ошибка 2. Нет вызова flip() или update() — экран остается черным, хотя рисование в коде есть. Pygame рисует в скрытый буфер, и без pygame.display.flip() кадр не попадает на экран. Исправление — вызывать flip() в конце каждого прохода цикла.

Ошибка 3. Нет цикла обработки событий — окно «зависает» и система считает программу не отвечающей. Исправление — держать внутри игрового цикла for event in pygame.event.get() и обрабатывать хотя бы pygame.QUIT.

Выводы

  • Pygame — библиотека Python для 2D-игр, а не движок: окно, рисование, звук и ввод она дает, но сцену и логику вы собираете кодом сами.
  • Сердце игры на Pygame — игровой цикл из трех шагов: события, обновление состояния, отрисовка кадра с flip().
  • Все, что видно на экране, — это поверхности (Surface); их рисуют в памяти и переносят на экран методом blit.
  • Разовые действия ловят через события KEYDOWN, непрерывное движение — через опрос pygame.key.get_pressed().
  • clock.tick(fps) держит стабильную скорость и не дает циклу зря нагружать процессор.
  • Pygame — для учебных и небольших 2D-проектов; для 3D и крупных игр берут Unity или Godot.

Где применяется / связь с практикой

Pygame — типичный первый шаг для тех, кто учится программировать на Python: игровой цикл, координаты и события наглядно показывают, как устроена интерактивная программа. Эти же навыки (циклы, классы, работа с состоянием) нужны и в «серьезной» разработке, не только в играх.

Освойте тему на практике

Если хочется собрать базу Python с нуля и довести первый проект до рабочего вида, посмотрите программу курса Python Basic. Понять, подходит ли вам формат и уровень, помогут бесплатные вебинары — там можно вживую посмотреть, как ведут занятия, и задать вопросы преподавателю.

Смежные темы: Python и создание 2D-игры: что нужно знать разработчику, Как написать игру на Python, Языки для программирования игр.

FAQ

Нужно ли знать Python перед изучением Pygame?
Да, базовый уровень обязателен: переменные, циклы, функции и классы. Pygame — это библиотека поверх Python, а не отдельный язык, поэтому без основ языка примеры будет сложно понять.

Можно ли собрать игру на Pygame в exe-файл для друзей без Python?
Да, готовый проект упаковывают в исполняемый файл сторонними инструментами (например, PyInstaller): пользователю не нужно ставить Python и Pygame отдельно.

Работает ли Pygame на телефоне?
Напрямую на iOS и Android Pygame не запускается — это библиотека для настольных ОС. Для мобильных игр на Python берут отдельные инструменты (например, Kivy) или другие движки.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)