Библиотека Pygame / Часть 1. Введение
Это первая часть серии руководств « Разработка игр с помощью Pygame ». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python.
Что такое Pygame?
Pygame — это «игровая библиотека», набор инструментов, помогающих программистам создавать игры. К ним относятся:
- Графика и анимация
- Звук (включая музыку)
- Управление (мышь, клавиатура, геймпад и так далее)
Игровой цикл
В сердце каждой игры лежит цикл, который принято называть «игровым циклом». Он запускается снова и снова, делая все, чтобы работала игра. Каждый цикл в игре называется кадром.
В каждом кадре происходит масса вещей, но их можно разбить на три категории:
1.Обработка ввода (события)
Речь идет обо всем, что происходит вне игры — тех событиях, на которые она должна реагировать. Это могут быть нажатия клавиш на клавиатуре, клики мышью и так далее.
2.Обновление игры
Изменение всего, что должно измениться в течение одного кадра. Если персонаж в воздухе, гравитация должна потянуть его вниз. Если два объекта встречаются на большой скорости, они должны взорваться.
3.Рендеринг (прорисовка)
В этом шаге все выводится на экран: фоны, персонажи, меню. Все, что игрок должен видеть, появляется на экране в нужном месте.
Время
Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК. Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.
Создание шаблона Pygame
Теперь, зная из каких элементов состоит игра, можно переходить к процессу написания кода. Начать стоит с создания простейшей программы pygame, которая всего лишь открывает окно и запускает игровой цикл. Это отправная точка для любого проекта pygame.
В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:
# Pygame шаблон - скелет для нового проекта Pygame import pygame import random WIDTH = 360 # ширина игрового окна HEIGHT = 480 # высота игрового окна FPS = 30 # частота кадров в секунду
Дальше необходимо открыть окно игры:
# создаем игру и окно pygame.init() pygame.mixer.init() # для звука screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock()
pygame.init() — это команда, которая запускает pygame. screen — окно программы, которое создается, когда мы задаем его размер в настройках. Дальше необходимо создать clock , чтобы убедиться, что игра работает с заданной частотой кадров.
Теперь необходимо создать игровой цикл:
# Цикл игры running = True while running: # Ввод процесса (события) # Обновление # Визуализация (сборка)
Игровой цикл — это цикл while , контролируемый переменной running . Если нужно завершить игру, необходимо всего лишь поменять значение running на False . В результате цикл завершится. Теперь можно заполнить каждый раздел базовым кодом.
Раздел рендеринга (отрисовки)
Начнем с раздела отрисовки. Персонажей пока нет, поэтому экран можно заполнить сплошным цветом. Чтобы сделать это, нужно разобраться, как компьютер обрабатывает цвета.
Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:

Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.
Узнать общее количество отображаемых компьютером цветов можно, умножив:
>>> 256 * 256 * 256 16,777,216
Теперь, зная, как работают цвета, можно задать их в начале программ:
# Цвета (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255)
А после этого — заполнить весь экран.
# Рендеринг screen.fill(BLACK)
Но этого недостаточно. Дисплей компьютера работает не так. Изменить пиксель — значит передать команду видеокарте, чтобы она передала соответствующую команду экрану. По компьютерным меркам это очень медленный процесс. Если нужно нарисовать на экране много всего, это займет много времени. Исправить это можно оригинальным способом, который называется — двойная буферизация. Звучит необычно, но вот что это такое.
Представьте, что у вас есть двусторонняя доска, которую можно поворачивать, показывая то одну, то вторую сторону. Одна будет дисплеем (то, что видит игрок), а вторая — оставаться скрытой, ее сможет «видеть» только компьютер. С каждым кадром рендеринг будет происходить на задней части доски. Когда отрисовка завершается, доска поворачивается и ее содержимое демонстрируется игроку.
А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.
В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :
# Рендеринг screen.fill(BLACK) # после отрисовки всего, переворачиваем экран pygame.display.flip()
Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.
Раздел ввода (событий)
Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.
События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них. Создается список, и с помощью цикла for можно пройтись по всем из них.
for event in pygame.event.get(): # проверить закрытие окна if event.type == pygame.QUIT: running = False
В pygame много событий, на которые он способен реагировать. pygame.QUIT — событие, которое стартует после нажатия крестика и передает значение False переменной running , в результате чего игровой цикл заканчивается.
Контроль FPS
Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:
while running: # держим цикл на правильной скорости clock.tick(FPS)
Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.
Итог
Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:
# Pygame шаблон - скелет для нового проекта Pygame import pygame import random WIDTH = 360 HEIGHT = 480 FPS = 30 # Задаем цвета WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # Создаем игру и окно pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Цикл игры running = True while running: # Держим цикл на правильной скорости clock.tick(FPS) # Ввод процесса (события) for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False # Обновление # Рендеринг screen.fill(BLACK) # После отрисовки всего, переворачиваем экран pygame.display.flip() pygame.quit()
Ура! У вас есть рабочий шаблон Pygame. Сохраните его в файле с понятным названием, например, pygame_template.py , чтобы можно было использовать его каждый раз при создании нового проекта pygame.
В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.
Как импортировать библиотеку pygame в python


import pygame import random pygame.init() screen_width = 600 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Змейка") green = (0, 255, 0) red = (255, 0, 0) font = pygame.font.SysFont("Arial", 20) clock = pygame.time.Clock() # основные параметры игры cell_size = 20 snake_speed = 5 snake_length = 3 snake_body = [] for i in range(snake_length): snake_body.append(pygame.Rect((screen_width / 2) - (cell_size * i), screen_height / 2, cell_size, cell_size)) snake_direction = "right" new_direction = "right" apple_position = pygame.Rect(random.randint(0, screen_width - cell_size), random.randint(0, screen_height - cell_size), cell_size, cell_size) game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP and snake_direction != "down": new_direction = "up" elif event.key == pygame.K_DOWN and snake_direction != "up": new_direction = "down" elif event.key == pygame.K_LEFT and snake_direction != "right": new_direction = "left" elif event.key == pygame.K_RIGHT and snake_direction != "left": new_direction = "right" # новое направление движения snake_direction = new_direction # управление змейкой if snake_direction == "up": snake_body.insert(0, pygame.Rect(snake_body[0].left, snake_body[0].top - cell_size, cell_size, cell_size)) elif snake_direction == "down": snake_body.insert(0, pygame.Rect(snake_body[0].left, snake_body[0].top + cell_size, cell_size, cell_size)) elif snake_direction == "left": snake_body.insert(0, pygame.Rect(snake_body[0].left - cell_size, snake_body[0].top, cell_size, cell_size)) elif snake_direction == "right": snake_body.insert(0, pygame.Rect(snake_body[0].left + cell_size, snake_body[0].top, cell_size, cell_size)) # проверяем, съела ли змея яблоко if snake_body[0].colliderect(apple_position): apple_position = pygame.Rect(random.randint(0, screen_width - cell_size), random.randint(0, screen_height-cell_size), cell_size, cell_size) snake_length += 1 if len(snake_body) > snake_length: snake_body.pop() # проверка столкновения со стенами if snake_body[0].left < 0 or snake_body[0].right >screen_width or snake_body[0].top < 0 or snake_body[0].bottom >screen_height: game_over = True # проверка столкновения с собственным телом for i in range(1, len(snake_body)): if snake_body[0].colliderect(snake_body[i]): game_over = True screen.fill((0, 0, 0)) # рисуем змейку for i in range(len(snake_body)): if i == 0: pygame.draw.circle(screen, green, snake_body[i].center, cell_size / 2) else: pygame.draw.circle(screen, green, snake_body[i].center, cell_size / 2) pygame.draw.circle(screen, (0, 200, 0), snake_body[i].center, cell_size / 4) # рисуем яблоко pygame.draw.circle(screen, red, apple_position.center, cell_size / 2) # выводим количество яблок score_text = font.render(f"Съедено яблок: ", True, (255, 255, 255)) screen.blit(score_text, (10, 10)) pygame.display.update() clock.tick(snake_speed) pygame.quit()
Подведем итоги
Мы рассмотрели самые простые приемы разработки игр в Pygame – возможности этой библиотеки намного обширнее. К примеру, для быстрой разработки в Pygame используются спрайты – объекты для определения свойств и поведения игровых элементов. Встроенные классы Group , GroupSingle и RenderUpdates позволяют быстро, просто и эффективно группировать, обновлять и отрисовывать игровые элементы.
В следующей главе будем изучать работу с SQL и базами данных .
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП: абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
Материалы по теме
- ️ Как написать игру на Python: 5 игровых движков
- Пишем Тетрис на Python с помощью библиотеки Pygame
Как подключить PyGame в PyCharm?
Как подключить библиотеку PyGame в PyCharm? Команда pip install pygame не работает. Добавление различных букв (w, u и др.) также не помогает. Попытки подключения библиотеки через Python также не дают результата. На официальном сайте PyGame полезной информации нет. Только pip install pygame для подключения.
Отслеживать
задан 21 янв 2023 в 19:47
47 8 8 бронзовых знаков
1) Ставите pygame в интерпретатор питона 2) В PyCharm у текущего проекта в настройках проекта указываете тот интерпретатор, в который ставили 3) Профит
21 янв 2023 в 19:50
Возможно, у вас в проекте в PyCharm есть питон в виртуальном окружении. В той же настройке проекта можно установить библиотеки через +
21 янв 2023 в 19:55
Спасибо за помощь, но я ничего не понимаю. Что за виртуальное окружение? Подозреваю, что у меня нет этого виртуального окружения. Я пытался запустить через IDLE, Консоль Python и в самом Python. Не знаю есть ли среди перечисленного интерпретатор. Также PyCharm на английском, а я английский не знаю, поэтому не знаю куда нажимать в настройках
22 янв 2023 в 10:00
Добавил описание в качестве ответа — комментарии для такого плохо предназначены 😀
22 янв 2023 в 10:48
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Открываете меню File/Settings.
- Переходите в Project/Python Interpreter
Там можно выбрать (1) или создать (2) интерпретатор питона, а так же устанавливать (3) в них библиотеки.
Выбранный там интерпретатор будет использоваться при запуске скриптов в проекте

Отслеживать
ответ дан 22 янв 2023 в 10:47
77.2k 6 6 золотых знаков 58 58 серебряных знаков 126 126 бронзовых знаков
Спасибо ещё раз. Сейчас более понятно. Зашёл куда было сказано и нажал там +, в новом окне ввёл ‘pygame’ и нажал install. Потом высветилось «Package ‘pygame’ installed successfully». И я закрыл то окно, но в изначальном окне было «Error occurred when installing package ‘pygame'». Я посмотрел подробнее и там было «Troubleshooting steps: 1. Try reading PyCharm guide on troubleshooting package installation. 2. Try installing this package by running the following comands is the terminal. If the command crashes in the terminal, the problem is out of IDE control.» Но по итогу всё работает, проверял.
22 янв 2023 в 12:48
Добавлю ещё, что в окне деталей о ошибке при установке было внутреннее окно с текстом. Я его через переводчик перевёл и там сказано, что отсутствует файл setup, поэтому будет через windows что-то делаться (я не помню точно). Надеюсь, что это не что-то важное.
Основы PyGame¶
Pygame — библиотека, предназначенная для разработки мультимедийных приложений с графическим интерфейсом, например игр.
Документация, обучающие материалы и дополнительная информация доступна разработчикам на сайте проекта: https://www.pygame.org/docs/
Начало работы¶
Начнем знакомство с библиотекой непосредственно с разбора примера простого приложения:
import pygame import sys pygame.init() screen = pygame.display.set_mode((1200, 800)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit()
В первую очередь импортируем модуль pygame в наш файл с исходным кодом:
import pygame
Затем вызываем функцию init() для подготовки модулей pygame к работе:
pygame.init()
После этого создаем графическое окно, передав в качестве аргумента в функцию set_mode() его разрешение в виде пары целых чисел. В свою очередь функция вернет нам объект типа Surface, используемый для представления изображений:
screen = pygame.display.set_mode((1200, 800))
Далее, запускаем основной цикл программы, в котором, среди всех событий, происходящих в нашем приложении, перехватываем событие закрытия основного графического окна пользователем:
while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit()
После того как ожидаемое событие наступило, завершаем работу с библиотекой pygame вызовом функции pygame.quit() и нашей программы вызовом функции exit() из модуля sys .
Рисование геометрических фигур¶
Разместим в окне нашего приложения прямоугольник. Прямоугольные объекты представлены типом Rect :
Rect(left, top, width, height) Rect((left, top), (width, height))
Для создания объекта этого типа нам необходимо указать координаты левого верхнего угла прямоугольника и длины его сторон:
r = Rect(0, 0, 100, 200)
Обратите внимание, что начало координат (0, 0) находится в левом верхнем углу окна.
В библиотеке pygame функции отображения геометрических фигур находятся в модуле draw . Нарисуем прямоугольник c помощью функции rect() :
rect(Surface, color, Rect, width=0) -> Rect
Для этого передадим в функцию в качестве аргументов поверхность, на которой мы размещаем прямоугольник, его цвет, сам прямоугольник и толщину линии — стороны прямоугольника. Если толщина равна нулю прямоугольник закрашивается сплошным цветом.
Рассмотрим готовый пример:
import pygame import sys pygame.init() screen = pygame.display.set_mode((1000, 800)) r = pygame.Rect(50, 50, 100, 200) pygame.draw.rect(screen, (255, 0, 0), r, 0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() pygame.display.flip()
Обратите внимание на последнюю строку нашей программы. На самом деле графические объекты которые мы хотим разместить на основном экране сначала попадают в специальный буфер. Чтобы отобразить изменения стали видны вызываем функцию flip() .
Функции для рисования графических фигур¶
pygame.draw. rect ( Surface, color, Rect, width=0 ) ¶
Нарисовать прямоугольник Rect на поверхности Surface , цветом color . Если толщина линии width равна нулю, прямоугольник закрашивается.
pygame.draw. line ( Surface, color, start_pos, end_pos, width=1 ) ¶
Нарисовать линию на поверхности Surface , цветом color , с началом в точке start_pos , концом в точке end_pos и толщиной линии width.
pygame.draw. lines ( Surface, color, closed, pointlist, width=1 ) ¶
Нарисовать линию, соединяющую точки из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если параметр closed равен True , конечная точка соединяется с начальной.
Нарисовать окружность на поверхности Surface, цветом color , с центром в точке pos и радиусом radius . Если толщина линии width равна нулю, окружность закрашивается.
Нарисовать эллипс, ограниченный прямоугольником Rect , на поверхности Surface , цветом color . Если толщина линии width равна нулю, эллипс закрашивается.
pygame.draw. polygon ( Surface, color, pointlist, width=0 ) ¶
Нарисовать многоугольник по точкам из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если толщина линии width равна нулю многоугольник закрашивается.
Цвет¶
Цвета в библиотеке pygame представлены в соответствии с моделью RGB: https://ru.wikipedia.org/wiki/RGB
Значение для цвета можно задать тройкой чисел, каждое из которых лежит в диапазоне от 0 до 255. Первое значение в последовательности определяет, какое количество красного содержится в данном оттенке, второе — зеленого, третье — голубого. Чем меньше значение числа, тем темнее будет оттенок. Например, красный цвет можно представить как (255, 0, 0), белый как (255, 255, 255), а черный как (0, 0, 0).
Помимо этого, в модуле color из библиотеки pygame содержится словарь THECOLORS, ключами которого являются названия различных цветовых оттенков. Подключить его можно с помощью команды:
from pygame.color import THECOLORS
Закрасим основной экран c помощью метода fill() :
screen = pygame.display.set_mode((1200, 800)) screen.fill(THECOLORS['orange'])
Текст и шрифты¶
При работе с текстом мы будем использовать шрифты — группы символов объединенных по стилистическому или иному признаку. Шрифты в библиотеке pygame представлены типом Font
Чтобы создать объект Font на основе имеющегося в системе шрифта вызовем следующую функцию:
SysFont(name, size, bold=False, italic=False)
С помощью параметра name передаем в функцию имя шрифта, параметр size — размер шрифта в пунктах. Параметры bold и italic отвечают за начертание шрифта.
Список имеющихся в системе шрифтов можно получить с помощью функции get_fonts() :
pygame.font.get_fonts() -> list of strings
Далее, с помощью метода render() нашего объекта типа Font получаем изображение с текстом, которое передаем на вход методу blit() для отрисовки на нашем основном экране:
screen = pygame.display.set_mode(size) screen.fill(THECOLORS['white']) font = pygame.font.SysFont('couriernew', 40) text = font.render(str('HELLO'), True, THECOLORS['green']) screen.blit(text, (50, 50))
Текст размещается в на основном экране по координатам (50, 50)
Задания¶
1. Используя функции для работы с графикой библиотеки pygame, нарисуйте дом с квадратным основанием и треугольной крышей.
2. Используя функции для работы с графикой библиотеки pygame, нарисуйте белый флаг с олимпийскими кольцами.
3. Разработайте программу, которая разбивает основное игровое окно на клетки заданного размера.
4. Доработайте программу так, чтобы в каждой клетке был записан её порядковый номер.
5. Доработайте в программу возможность закрашивания клетки с произвольным номером случайным цветом. Номера клеток которые необходимо закрасить считывать из файла.
© Copyright Revision d00c0df4 .
Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest
Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.