Python pygame что это
Что такое Pygame? Каркас приложения, FPS
Используя эти возможности, программист имеет возможность создавать простые графические приложения, в том числе и несложные игры. Возможно, вы уже обратили внимание, что библиотека PyGame не содержит физического движка и всю физику в играх приходится прописывать самостоятельно на основе уравнений физики. Также в этой библиотеке нет понятий камер и все изменения состояний на плоскости осуществляется путем простого перемещения объектов в области игрового пространства. Так что, PyGame определенно не игровой движок, но очень удобен, когда нужно быстро реализовать графическое приложение с элементарной анимацией на плоскости и некоторыми звуковыми эффектами.
и подробной документацией:
С чего мы начнем и как будем изучать этот модуль? Вначале нужно понять общий принцип работы PyGame и основные возможности его функционала. А, затем, на конкретных примерах посмотреть, как это все работает. Именно с этих позиций я и буду строить наши занятия.
Установка PyGame
Первым делом нам нужно установить PyGame. Делается это очень просто. Под ОС Windows следует выполнить команду:
pip install pygame
(похожим образом происходит установка и в других ОС). Далее, непосредственно в Python, создайте новый проект и запишите две строчки:
Если они выполняются без ошибок, значит библиотека установлена и готова к работе.
Каркас приложения
Давайте теперь реализуем простейшее минимальное приложение на PyGame. Первые две строчки у нас уже есть. Фактически, первая выполняет импорт основного модуля, а вторая импортирует массу других необходимых расширений (иначе бы нам каждый раз приходилось бы делать это вручную). То есть, мы здесь просто подключили саму библиотеку. Что дальше? Далее сформируем окно самого приложения с помощью следующей функции:
Если теперь запустить эту программу, то мы увидим окно на экране, которое тут же закроется. Почему приложение так себя ведет? Дело в том, что все три строчки были выполнены и программа попросту завершилась. Мы увидели окно, которое потом было автоматически закрыто. Чтобы оно оставалось на экране и отображало текущую графическую информацию, необходимо добавить главный цикл обработки событий:
То есть, в нашем приложении должен быть цикл, в котором постоянно просматриваются возникающие события из очереди событий, а затем, обрабатываются (другими словами, выполняются некоторые действия в зависимости от типа события).
Для реализации такого цикла можно создать «вечный» цикл, в котором будут проверяться произошедшие события и при необходимости обрабатываться. В самом простом варианте это можно сделать так:
Смотрите, здесь задан «вечный цикл» и внутри еще один цикл for, который выбирает события из очереди событий. Сама очередь – это итерируемый объект, к которому мы обращаемся с помощью конструкции pygame.event.get(). В результате переменная event будет ссылаться на текущее событие из этой очереди. Каждое событие – это объект, который содержит наборы различных свойств. В частности, все события имеют свойство type, которое мы и проверяем. Если оно равно константе pygame.QUIT, значит, пришло событие закрытия приложения. И здесь, в качестве обработчика выступает стандартная Python-функция exit, которая завершает наше приложение. Теперь, при запуске программы мы видим окно на экране, пока не закроем его. При закрытии срабатывает событие pygame.QUIT и программа завершается. Если, в качестве примера, вместо exit написать pass, то наше окно закрываться не будет, т.к. мы фактически удалили обработчик и ничего не делаем при возникновении этого события.
Однако, использовать непосредственно функцию exit() не всегда бывает удобно. Возможно, нам нужно просто завершить цикл и остановить работу PyGame, но продолжать дальнейшее выполнение программы. В этом случае можно воспользоваться функцией quit() пакета PyGame:
Но при закрытии окна мы увидим ошибку (исключение). Откуда она взялась? Это из-за того, что при остановке PyGame основной цикл продолжает работать и на следующей итерации пытается обратиться к очереди событий. Но эта команда уже не может быть выполнена, т.к. PyGame остановлен и уже не работает. Отсюда и возникает это исключение. Поэтому, мы поправим эту программу, добавим условие работы главного цикла:
Теперь все работает так, как мы этого и ожидаем. Вот так выглядит минимальный каркас приложения PyGame.
Задержка и формирование нужного FPS
Однако в такой реализации есть один существенный недостаток. Главный цикл работает слишком быстро: каждые несколько миллисекунд проверяется очередь событий. Это избыточно нагружает процессор компьютера. События так быстро не генерируются. Даже когда выполняется анимация в динамических играх (типа арканоид), вполне достаточно 60 кадров в секунду, т.е. выполнять главный цикл с частотой:
1/60 сек = 17 миллисекунд
А в статических играх, типа пасьянс, минер и т.п., достаточно 30 кадров в секунду:
1/30 сек = 34 миллисекунд
Как создать нужные задержки в главном цикле приложения? Если действовать «в лоб», то можно просто прописать эти временные величины внутри цикла while:
Но это не лучшее решение: на разных устройствах время выполнения итерации цикла будет разным (из-за разной скорости работы ЦП). Здесь задержка в 20 мс добавляется ко времени выполнения программы внутри цикла. То есть, мы не учитываем время обработки событий, а просто добавляем задержку в 20 мс. В результате цикл будет работать немного дольше. И это может негативно сказаться на игровом процессе: на одном устройстве игровой персонаж будет быстрее проходить уровень, а на другом – медленнее. Поэтому, правильнее использовать встроенный в PyGame инструмент тиков на основе класса Clock:
Здесь в методе tick указывается частота выполнения цикла за одну секунду. То есть, параметр 60 указывает выполнять цикл while 60 раз в секунду. При этом автоматически учитывается время, затраченное на выполнение других строчек кода на каждой текущей итерации и оно вычитается при формировании задержки. В результате, мы получаем время каждой итерации примерно 17 мс. И это время будет одинаковым на всех устройствах (разумеется, если оно будет способно обеспечивать такую скорость выполнения итераций цикла).
Вот эту величину (60) называют Frames Per Second (FPS) и, обычно, определяют вначале программы через переменную:
Наконец, последний штрих. Изменим заголовок окна и его иконку. Это делается с помощью вот таких двух строчек:
Например, если прописать флаг:
то окно можно будет менять в размерах. Или так:
Мы здесь сразу включаем двойную буферизацию, аппаратное ускорение и полноэкранный режим. По аналогии используются остальные флаги.
Вот так мы с вами получили вполне рабочий каркас приложения на PyGame. На следующем занятии увидим как можно рисовать графические примитивы в окне программы.
Видео по теме
Что такое Pygame? Каркас приложения, FPS | Pygame #1
Рисование графических примитивов | Pygame #2
Как обрабатывать события от клавиатуры | Pygame #3
Как обрабатывать события от мыши | Pygame #4
Создание поверхностей (Surface) и их анимация. Метод blit | Pygame #5
Класс Rect. Его роль, свойства и методы | Pygame #6
Как рисовать текст различными шрифтами | Pygame #7
Как работать с изображениями. Модули image и transform | Pygame #8
Что такое спрайты и как с ними работать | Pygame #9
Как делать контроль столкновений | Pygame #10
Добавляем звук в игровой процесс. Модули mixer и music | Pygame #11
© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Библиотека pygame №1
Для того чтобы установить pygame на свой компьютер необходимо открыть командную строку или терминал и написать команду
pip3 install pygame
После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры
# Импортируем библиотеку pygame
import pygame
# Импортируем системную функцию exit
from sys import exit
# Инициализируем pygame
pygame. init ()
# Основной цикл игры
while True :
# Ждем события (действия пользователя)
f or event in pygame.event. get ():
# Если нажали на крестик,
# то закрываем окно
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
# Обновляем поверхность игры
# на каждом шаге основного цикла игры
pygame.display. update ()
Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую).
Ограничим количество выполнений цикла.
import pygame
from sys import exit
FPS = 60 # Создаем переменную FPS
clock = pg.time. Clock () # Создаем счетчик для FPS
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
clock. tick (FPS) # Замедляем цикл до 60 выполнений в секунду
Методу tick() передается желаемое количество кадров в секунду. Задержку он вычисляет сам. На каждой итерации основного цикла игры секунда делится на 60 и на вычисленную величину выполняется задержка.
Рисование фигур
В библиотеке pygame существует множество функций для рисования различных фигур.
Функция polygon() рисует произвольную фигуру. Она принимает 3 обязательных параметра (поверхность, цвет и кортеж координат) и 1 необязательный (толщину линий).
import pygame
from sys import exit
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Давайте нарисуем треугольник
import pygame
from sys import exit
FPS = 60 # Создаем переменную FPS
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Самостоятельно нарисуйте пятиугольник (вам помогут карандаш и лист бумаги)
Рисование окружностей
Чтобы нарисовать окружность нужно вызвать метод circle из модуля draw. Команда выглядит так: pygame.draw.circle(display, color, position, radius).
import pygame
from sys import exit
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Объявления переменных для цветов
Для нашего с вами удобства давайте объявим несколько переменных, в которые сохраним используемые нами цвета
import pygame
from sys import exit
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Рисование прямоугольников
Для отрисовки прямоугольников можно использовать метод rect.
pygame.draw.rect(display, color, (x, y, width, height) )
import pygame
from sys import exit
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw
Там можно найти рисование линий, дуг, эллипсов.
Большой пример ( запусти его у себя на компьтере:
Задания:
1. Нарисуйте дерево из minecraft, используя полученные знания
2. Нарисуйте оранжевую, красную, синию и фиолетовую звезды
Pygame и разработка игр
Что такое Pygame
Pygame – это библиотека модулей для языка Python, созданная для разработки 2D игр. Также Pygame могут называть фреймворком. В программировании понятия «библиотека» и «фреймворк» несколько разные. Но когда дело касается классификации конкретного инструмента, не все так однозначно.
В любом случае, фреймворк является более мощным по-сравнению с библиотекой, он накладывает свою специфику на особенности программирования и сферу использования продукта. С точки зрения специфики Pygame – это фреймворк. Однако его сложно назвать «мощным инструментом». По своему объему и функционалу это скорее библиотека.
Также существует понятие «игрового движка» как программной среды для разработки игр. По своему назначению Pygame можно считать игровым движком. В то же время, с точки зрения классификации программного обеспечения, Pygame является API для Питона к API библиотеки SDL.
API – это интерфейс (в основном набор функций и классов) для прикладного (часто более высокоуровневого) программирования, который предоставляет, например, та или иная библиотека. SDL – это библиотека, которая работает с мультимедийными устройствами компьютера.
В этом смысле Pygame можно сравнить с Tkinter, который через свои функции и классы предоставляет Питону доступ к графической библиотеке Tk.
Особенности разработки компьютерных игр
Игры событийно-ориентированны, также как любое приложение с графическим интерфейсом пользователя. Поэтому какие-никакие, но игры можно было бы писать с помощью Tkinter, в частности на его экземплярах холста. Но поскольку основное назначение библиотеки графического пользовательского интерфейса совсем другое, то пришлось бы изобретать велосипеды. В то время как библиотека, специально предназначенная для написания игр, уже содержит необходимые объекты, что упрощает разработку.
Например, чтобы определить, столкнулись ли два объекта, надо написать код, проверяющий совпадение координат. Это может быть непростой задачей, так как надо учесть области перекрытия, форму объектов и др. В то же время игровой движок может включать готовую функцию проверки коллизии (столкновения) с необходимыми опциями настройки.
При всем этом Pygame достаточно низкоуровневый игровой движок, если его можно так называть. Это значит, что многое в нем не остается за кадром, а дается программисту на доработку, вынуждает его понимать, как работают «шестеренки». Так в Pygame отсутствует эмуляция физических явлений. Если вам надо смоделировать движение с ускорением или по дуге, программируйте это сами, предварительно взяв из курса физики соответствующую формулу.
Игры относятся к мультимедийным приложениям. Однако, в отличие от других приложений этой группы, для них характерна сложная программная логика и нередко много математики, хотя достаточно простой, плюс эмуляция физических явлений. В играх программируется подобие искусственного интеллекта. В многопользовательской игре, хотя пользователи играют друг с другом, а не с ИИ, создаются виртуальные миры, существующие по законам, заложенным разработчиками.
В программном коде игры выделяют три основных логических блока:
Отслеживание событий, производимых пользователем и не только им.
Изменение состояний объектов, согласно произошедшим событиям.
Отображение объектов на экране, согласно их текущим состояниям.
Эти три этапа повторяются в цикле бесчисленное количество раз, пока игра запущена.
Место Pygame среди инструментов разработки игр
Популярна ли библиотека pygame, пишут ли на ней сложные игры? Хотя на Pygame есть востребованные игры, в подавляющем случае – нет. Для программирования под андроид и десктоп существуют более функциональные игровые движки.
Для создания двумерных браузерных игр инди-разработчики (от слова independent – независимый, здесь понимается как «одиночка», «не работающий в команде или на фирму») часто используют JavaScript и его игровые библиотеки, так как JS родной для веба язык. Хотя существуют проекты перевода с Python на JavaScript (https://github.com/jggatc/pyjsdl).
В чем тогда преимущество Pygame? Оно в легком вхождении в отрасль и прототипировании. Pygame – небольшая библиотека. Сам Python позволяет писать короткий и ясный код. Так что это хорошее начало, чтобы познакомиться с особенностями разработки игр. Более опытными программистами Pygame может использоваться для быстрого создания прототипа игры, чтобы посмотреть, как все будет работать. После этого программа переписывается на другом языке. Другими словами, преимущество Pygame в легком обучении и быстрой разработке.
После Pygame жизнь разработчика игр на Питоне не заканчивается. Следует посмотреть в сторону Kivy (https://kivy.org). Это уже полноценный фреймворк, позволяющий писать на Python не только игровые приложения. В большей степени ориентирован для разработки под мобильные платформы.
Как установить Pygame
Pygame не входит в стандартную библиотеку Python, то есть не поставляется с установочным пакетом, а требует отдельной установки. В Ubuntu и родственных дистрибутивах его можно установить с помощью pip:
Если pip не установлен, предварительно выполняем команду:
Дополнительную информацию по установке смотрите здесь: https://www.pygame.org/wiki/GettingStarted
Проверить, что все установилось нормально, можно так:
Для Windows вместо ‘python3’ надо писать ‘py’. Произойдет запуск игры aliens, включенной в модуль examples (примеры) библиотеки pygame.
Шапошникова С. (plustilino) © 2020
Pygame. Введение в разработку игр на Python
Создание игр на Python 3 и Pygame: Часть 1
Многие разработчики приходят в разработку ПО, потому что хотят создавать игры. Не все могут стать профессиональными разработчиками игр, но любой может создавать собственные игры из интереса (а может быть, и с выгодой). В этом туториале, состоящем из пяти частей, я расскажу вам, как создавать двухмерные однопользовательские игры с помощью Python 3 и замечательного фреймворка PyGame.
Мы создадим версию классической игры Breakout. Освоив этот туториал, вы будете чётко понимать, что необходимо для создания игры, познакомитесь с возможностями Pygame и напишете собственный пример игры.
Мы реализуем следующие функции и возможности:
Краткое введение в программирование игр
Главное в играх — перемещение пикселей на экране и издаваемый шум. Почти во всех видеоиграх есть эти элементы. В этой статье мы не будем рассматривать клиент-серверные и многопользовательские игры, для которых требуется много сетевого программирования.
Основной цикл
Основной цикл (main loop) игры выполняется и обновляет экран через фиксированные интервалы времени. Они называются частотой кадров и определяют плавность перемещения. Обычно игры обновляют экран 30-60 раз в секунду. Если частота будет меньше, то покажется, что объекты на экране дёргаются.
Внутри основного цикла есть три основных операции: обработка событий, обновление состояния игры и отрисовка текущего состояния на экране.
Обработка событий
События в игре состоят из всего, что происходит за пределами управления кода игры, но относится к выполнению игры. Например, если в Breakout игрок нажимает клавишу «стрелка влево», то игре нужно переместить ракетку влево. Стандартными событиями являются нажатия (и отжатия) клавиш, движение мыши, нажатия кнопок мыши (особенно в меню) и события таймера (например, действие спецэффекта может длиться 10 секунд).
Обновление состояния
Сердце любой игры — это её состояние: всё то, что она отслеживает и отрисовывает на экране. В случае Breakout к состоянию относятся положение всех кирпичей, позиция и скорость мяча, положение ракетки, а также жизни и очки.
Существует также вспомогательное состояние, позволяющее управлять игрой:
Отрисовка
Игре нужно отображать своё состояние на экране, в том числе отрисовывать геометрические фигуры, изображения и текст.
Игровая физика
В большинстве игр симулируется физическое окружение. В Breakout мяч отскакивает от объектов и имеет очень приблизительную систему физики твёрдого тела (если это можно так назвать).
В более сложных играх могут использоваться более изощрённые и реалистичные физические системы (особенно в 3D-играх). Стоит также отметить, что в некоторых играх, например, в карточных, физики почти нет, и это совершенно нормально.
ИИ (искусственный интеллект)
Например, враги преследуют игрока и знают о его местоположении. В Breakout нет никакого ИИ. Игрок сражается с холодными и твёрдыми кирпичами. Однако ИИ в играх часто очень прост и всего лишь следует простым (или сложным) правилам, обеспечивающим псевдоразумные результаты.
Воспроизведение звука
Воспроизведение звука — ещё один важный аспект игр. В общем случае существует два типа звука: фоновая музыка и звуковые эффекты. В Breakout я реализую только звуковые эффекты, которые воспроизводятся при различных событиях.
Фоновая музыка — это просто музыка, постоянно играющая на фоне. В некоторых играх она не используется, а в некоторых меняется на каждом уровне.
Жизни, очки и уровни
В большинстве игр игрок имеет определённое количество жизней, и когда они заканчиваются, игра завершается. Также в играх часто присутствуют очки, позволяющие понять, насколько хорошо мы играем, и дающие мотивацию к самосовершенствованию или просто хвастаться друзьям своими рекордами. Во многих играх есть уровни, которые или совершенно отличаются, или постепенно увеличивают сложность.
Знакомство с Pygame
Прежде чем приступить к реализации игры, давайте немного узнаем о Pygame, который возьмёт на себя большую часть работы.
Что такое Pygame?
Pygame — это фреймворк языка Python для программирования игр. Он создан поверх SDL и обладает всем необходимым:
Установка Pygame
Это станет серьёзным препятствием при запуске игры. В конце концов мне пришлось запускать её в Windows внутри VirtualBox VM. Надеюсь, ко времени прочтения этой статьи проблема будет решена.
Архитектура игры
Играм нужно управлять кучей информации и выполнять почти одинаковые операции со множеством объектов. Breakout — это небольшая игра, однако попытка управлять всем в одном файле может оказаться слишком утомительной. Поэтому я решил создать файловую структуру и архитектуру, которая подойдёт и для гораздо более крупных игр.
Структура папок и файлов
Pipfile и Pipfile.lock — это современный способ управления зависимостями в Python. Папка images содержит изображения, используемые игрой (в нашей версии будет только фоновое изображение), а в папке sound_effects directory лежат короткие звуковые клипы, используемые (как можно догадаться) в качестве звуковых эффектов.
Файлы ball.py, paddle.py и brick.py содержат код, относящийся к каждому из этих объектов Breakout. Подробнее я рассмотрю их в следующих частях туториала. Файл text_object.py содержит код отображения текста на экране, а в файле background.py содержится игровая логика Breakout.
Однако существует несколько модулей, создающих произвольный «скелет» общего назначения. Определённые в них классы можно будет использовать в других играх на основе Pygame.
Класс GameObject
GameObject представляет собой визуальный объект, знающий о том, как себя рендерить, сохранять свои границы и перемещаться. В Pygame есть и класс Sprite, исполняющий похожую роль, но в этом туториале я хочу показать вам, как всё работает на низком уровне, а не полагаться слишком активно на готовую магию. Вот как выглядит класс GameObject:
Класс Game
Класс Game — это ядро игры. Он выполняется в основном цикле. В нём есть множество полезных возможностей. Давайте разберём его метод за методом.
Метод __init__() инициализирует сам Pygame, систему шрифтов и звуковой микшер. Три разных вызова нужны, так как не во всякой игре на Pygame используются все компоненты, поэтому можно контролировать подсистемы, которые мы используем, и инициализировать только нужные с соответствующими параметрами. Метод создаёт фоновое изображение, основную поверхность (на которой всё отрисовывается) и игровой таймер с правильной частотой кадров.
Элемент self.objects хранит все игровые объекты, которые должны рендериться и обновляться. Различные обработчики управляют списками функций-обработчиков, которые должны выполняться при определённых событиях.
Методы update() и draw() очень просты. Они обходят все управляемые игровые объекты и вызывают соответствующие им методы. Если два объекта накладываются друг на друга на экране, то порядок списка объектов определяет, какой из них будет рендериться первым, а остальные будут частично или полностью его перекрывать.
Метод handle_events() слушает события, генерируемые Pygame, такие как события клавиш и мыши. Для каждого события он вызывает все функции-обработчики, которые должны обрабатывать события соответствующих типов.
Затем он обновляет экран, то есть записывает на физический дисплей всё содержимое, которое было отрендерено на текущей итерации. И последнее, но не менее важное — он вызывает метод clock.tick() для управления тем, когда будет вызвана следующая итерация.
Заключение
В этой части мы изучили основы программирования игр и все компоненты, участвующие в создании игр. Также мы рассмотрели сам Pygame и узнали, как его установить. Наконец, мы погрузились в архитектуру игры и изучили структуру папок, классы GameObject и Game.