Основы разработки игр на Pygame: гайд с нуля (лонг)
Учимся анимировать графику и изображения, обрабатывать столкновения, запоминать состояния и управлять персонажами. В конце статьи сделаем 10 мини-симуляторов и лайт-версий известных игр.
Python – интерпретируемый язык, и по этой причине он не отличается высокой производительностью, которая необходима для сложных игр с гиперреалистичной графикой. Тем не менее есть несколько способов оптимизации, которые значительно ускоряют выполнение Python-кода, что позволяет писать на Питоне вполне приличные игры. Оптимизацию необязательно делать самостоятельно – в значительной степени эту задачу берут на себя специальные фреймворки и библиотеки. Фреймворков и библиотек для разработки игр на основе Python довольно много, вот самые популярные:
- Pygame
- PyKyra
- Pyglet
- Panda3D
- Kivy
- PyopenGL
Мы остановимся на самой популярной библиотеке, Pygame – она отлично подходит для начинающих разработчиков, и к тому же часто используется для быстрого прототипирования игр. На официальном сайте Pygame есть каталог игр, созданных с помощью библиотеки. Еще примеры игр на Pygame можно посмотреть здесь.
Pygame не входит в стандартную поставку Python, для установки библиотеки выполните:
Все возможности библиотеки Pygame нереально рассмотреть в одной статье, поэтому здесь мы затронем только самые базовые концепции – рисование, движение объектов, покадровую анимацию, обработку событий, обновление счетчика, обнаружение столкновения.
Окно и главный цикл приложения
Создание любого приложения на базе Pygame начинается с импорта и инициализации библиотеки. Затем нужно определить параметры окна, и по желанию – задать цвет (или изображение) фона:
Цикл while True играет роль главного цикла программы – в нем происходит отслеживание событий приложения и действий пользователя. Функция pygame.quit() завершает работу приложения, и ее можно назвать противоположностью функции pygame.init(). Для завершения Python-процесса используется exit(), с той же целью можно использовать sys.exit(), но ее нужно импортировать в начале программы: import sys.
В качестве фона можно использовать изображение:
Обработку событий (нажатий клавиш и кликов) в Pygame реализовать очень просто – благодаря встроенным функциям. Приведенный ниже код изменяет цвет фона после клика по кнопке. Обратите внимание, что в Pygame можно задавать цвет несколькими способами:
Как очевидно из приведенного выше примера, основной цикл Pygame приложения состоит из трех повторяющихся действий:
- Обработка событий (нажатий клавиш или кнопок).
- Обновление состояния.
- Отрисовка состояния на экране.
GUI для PyGame
Pygame позволяет легко и быстро интегрировать в проект многие нужные вещи – шрифты, звук, обработку событий, – однако не имеет встроенных виджетов для создания кнопок, лейблов, индикаторов выполнения и других подобных элементов интерфейса. Эту проблему разработчик должен решать либо самостоятельно (нарисовать прямоугольник, назначить ему функцию кнопки), либо с помощью дополнительных GUI-библиотек. Таких библиотек несколько, к самым популярным относятся:
Вот простой пример использования Pygame GUI – зеленые нули и единицы падают вниз в стиле «Матрицы»:
Рисование
В Pygame есть функции для простого рисования геометрических фигур – прямоугольников, окружностей, эллипсов, линий, многоугольников. Вот пример:
Анимация и обработка событий
Выше, в примере с падающими символами в «Матрице», уже был показан принцип простейшей имитации движения, который заключается в последовательном изменении координат объекта и обновлении экрана с установленной частотой кадраpygame.time.Clock().tick(60). Усложним задачу – сделаем простую анимацию с падающими розовыми «звездами». Приложение будет поддерживать обработку двух событий:
- При клике мышью по экрану анимация останавливается.
- При нажатии клавиши Enter – возобновляется.
Кроме того, добавим счетчик упавших звезд. Готовый код выглядит так:
Покадровая анимация
Если у вас есть в запасе картинки с раскадровкой движения, превратить их в анимацию не составит труда:
Столкновение объектов
В этом примере расстояние между объектами проверяется до тех пор, пока объекты не столкнутся. В момент столкновение движение прекращается, а цвет объектов – изменяется:
Управление движением объекта
Для управления движением (в нашем случае – с помощью клавиш ← и →) используются pygame.K_RIGHT (вправо) и pygame.K_LEFT (влево). В приведенном ниже примере передвижение падающих окружностей возможно только до момента приземления на дно игрового поля, или на предыдущие фигуры. Для упрощения вычисления факта столкновения фигур окружности вписываются в прямоугольники:
Практика
Задание 1 – Лестница
Напишите Pygame игру, в которой игрок (красная окружность) поднимается вверх по ступеням лестницы. Необходимо подсчитывать сделанные шаги.
Пример:
Решение:
Задание 2 – Лабиринт
Напишите Pygame игру, которая генерирует лабиринт из вертикальных стен со случайным количеством дверей. Игрок (красная окружность) должен проходить через двери.
Пример:
Решение:
Задание 3 – Дождь
Используя Pygame, напишите симулятор дождя: падение каждой сотни капель приводит к подъему уровня воды на 1 пиксель.
Пример:
Задание 4 – Мерцающие звезды
Используя Pygame, напишите симулятор звездного неба – окружности, представляющие собой звезды, сжимаются и расширяются, имитируя мерцание.
Пример:
Решение:
Задание 5 – Колобок
Используя Pygame, создайте анимацию, в которой лиса (состоящая из этих фреймов) преследует Колобка. Колобок вращается вокруг своей оси.
Пример:
Решение:
Код решения и необходимые изображения.
Задание 6 – Светофор
Напишите Pygame приложение для демонстрации работы светофора: когда горит зеленый свет (6 секунд), прямоугольники-автомобили движутся вперед. Красный и желтый свет включаются на 2 секунды каждый, в это время трафик останавливается.
Пример:
Решение:
Задание 7 – Визуальная память
Напишите лайт-версию игры Memory game, используя возможности Pygame. Сначала приложение выводит (в случайном порядке) цветные окружности и дает возможность пользователю запомнить их расположение в течение нескольких секунд. Затем приложение закрывает цветные окружности серыми: пользователь должен по памяти сопоставить цветные пары. Каждая угаданная пара приносит пользователю 1 балл.
Пример:
Решение:
Задание 8 – Подсчет фигур
Напишите Pygame приложение, в котором сверху окна вниз плавно спускаются случайные разноцветные фигуры – треугольники, квадраты и окружности. Цвет для фигур выбирается случайным образом, результаты подсчета выводятся в верхнем левом углу окна.
Пример:
Решение:
Задание 9 – Призы и бомбы
Напишите Pygame игру, в которой игрок (зеленая окружность) должен «ловить» синие треугольники («призы»), избегая столкновения с красными окружностями («бомбами»). Количество пойманных призов нужно подсчитывать.
Пример:
Решение:
Задание 10 – Змейка
Напишите лайт-версию игры «Змейка», используя Pygame. Змейка ест красные яблоки, которые появляются в случайных позициях в пределах игрового поля, и прибавляет в длине после каждого яблока. При столкновении с хвостом или границей окна игра заканчивается.
Пример:
Решение:
Подведем итоги
Мы рассмотрели самые простые приемы разработки игр в Pygame – возможности этой библиотеки намного обширнее. К примеру, для быстрой разработки в Pygame используются спрайты – объекты для определения свойств и поведения игровых элементов. Встроенные классы Group, GroupSingle и RenderUpdates позволяют быстро, просто и эффективно группировать, обновлять и отрисовывать игровые элементы.
Еще больше полезного материала по геймдеву 👇