Python – распространенный язык программирования, который в основном используется для небольших проектов. Он применяется в них в качестве вспомогательного инструмента. На Python пишутся бизнес-приложения и разнообразные программы. Трудно поверить, но игры с его помощью тоже создаются.
В основном Python ориентирован на программирование 2D-игр элементарного типа. Более сложные и трехмерные проекты на «чистом» Питоне написать не получится – лишь использовать его в качестве дополнительного инструмента разработчика.
Сегодня предстоит познакомиться с разработкой 2D-игры на Python поближе. Предстоит рассмотреть способы реализации поставленной задачи, изучить наиболее популярные движки для нее, а также ознакомиться с библиотеками и фреймворками, помогающими создавать игровой контент. Вниманию также будет представлен первый 2D-проект на Python – игра под названием «Змейка».
Предложенная информация ориентирована на широкий круг лиц. Она подойдет как обычным ПК-пользователям, так и IT-специалистам. Соответствующие данные помогут разобраться с планом действий при разработке 2D-игр, а также познакомит с наиболее распространенными инструментами для реализации поставленной задачи.
План по разработке игры
Разработка программного обеспечения и игр отличаются друг от друга. Каждый игровой контент начинается с составления дальнейшего плана действий. Он поможет не «тормозить» на том или ином этапе создания игры. Готовый проект с грамотной реализацией практически сразу начнет приносить прибыль.
Чтобы создавать 2D (и даже 3D) игры на Python, рекомендуется придерживаться примерно такого алгоритма действий:
- Определиться с языком программирования, на котором будет написан игровой проект. В рассматриваемом случае это Python. Для сложных и крупных игр нередко используют Java и C++.
- Изучить основы выбранного языка программирования.
- Ознакомиться с фреймворками и библиотеками языка, ориентированными на создание игрового контента.
- Выбрать способ разработки. Существуют две концепции, от определения которых немного будет меняться скорость программирования игры и ее функциональные возможности.
- Придумать сюжетную линию и жанр игры. На соответствующем этапе рекомендуется провести тщательный анализ целевой аудитории. Можно начать именно с этого шага – может быть, Python окажется неподходящим для запланированного проекта.
- Заняться разработкой механики, физики и анимации.
- Написать исходный код запланированного проекта.
- Соединить все игровые компоненты в общий проект.
- Организовать тестирование игры. Этот этап поможет выявить и устранить разнообразные ошибки. По мере необходимости нужно провести повторную отладку и тестирование.
- Выложить готовый проект в общий доступ для пользователей.
Некоторые разработчики нередко выкладывают «альфа» и «бета» версии игр в общий доступ для скачивания и эксплуатации. Такой подход особо актуален для сложного программного обеспечения. Он поможет не только выявить разнообразные ошибки в работе проекта, но и даст возможность получить обратную связь от потенциальной целевой аудитории. Конечные пользователи нередко предлагают разнообразные идеи по совершенствованию игр, которые повысили бы их интерес. Такая информация – на вес золота.
Изначально может показаться, что создание игр (даже двумерных) – это простая задача. На самом деле – это неверное утверждение. Чтобы создать развлекательное программное обеспечение, предстоит изучить много информации и освоить огромное количество навыков/инструментов. Особенно это касается разработки с нуля. Формирования физики, анимации, дизайна и программирование исходного кода нередко отнимает очень много времени.
Способы разработки
Разрабатывать игровые проекты можно несколькими способами:
- Через игровые движки. Этот вариант хорошо подходит новичкам.
- С нуля. Отличный вариант для простейших проектов и опытных разработчиков.
В случае разработки через движки необходимо скачать специальное программное обеспечение – игровой движок. В нем обычно есть все, что может пригодиться разработчику для выпуска собственного развлекательного проекта: от графики и анимации до физики и звуковых сигналов. Движок представляет собой готовый пакет решений для программирования игр. Нередко в нем есть специальные «магазины» – там доступны дополнительные инструменты. Некоторые из них распространяются бесплатно, а за какие-то придется заплатить.
Разработка через игровые движки помогает быстро создавать 2D и 3D игры, но их функциональные возможности нередко сильно ограничены. 100 % уникальный проект сделать с их помощью не представится возможным. Зато нередко именно такой подход подразумевает отсутствие у разработчика знаний языков программирования.
Чтобы на выходе получить полностью уникальный игровой проект, необходимо воспользоваться разработкой с нуля. В этом случае физика, анимация, механика и программный код игры будут записаны программистом самостоятельно. Обычно средние и крупные проекты требуют привлечения целой команды разработчиков – иначе процесс может затянуться. Это достаточно сложный в плане реализации подход к программированию игр, но именно он нередко приносит наибольшую отдачу.
В Python под движками обычно подразумеваются готовые библиотеки, ориентированные на создание игр. Поэтому фактическая разработка с нуля рассмотрена не будет. Далее предстоит ознакомиться с «классическими» движками для программирования игр и с наиболее распространенными библиотеками для реализации поставленной задачи.
Unreal Engine
Unreal Engine – игровой движок, который можно считать универсальным. Он подходит для создания не только 2D, но и 3D игр. Его ориентированность – трехмерная графика.
Данный продукт поддерживает C++ в качестве основного языка программирования. Python здесь может использоваться в виде дополнительного инструмента. Также в Unreal Engine есть специальный язык – Blueprints. Он ориентирован на новичков и является визуальным языком разработки.
Unreal Engine рекомендуется использовать тогда, когда в планах создание 3D-игры. Он предлагает хорошую производительность и множество полезных инструментов. Для 2D-игр этот движок почти не используется.
Unity
Unity – это кроссплатформенный игровой движок, который появился в 2005 году. Он ориентирован не только на трехмерную графику, но и на двухмерную. Позволяет писать игры для приставок, компьютеров, а также смартфонов и планшетов.
Unity – движок, позволяющий создавать браузерные игры и контент, работающий на операционных системах iOS и Android. Нередко он используется для написания проектов с использованием технологий AR и VR.
Unity имеет следующие особенности:
- наличие визуальной среды разработки;
- кроссплатформенность;
- поддержка нескольких языков программирования;
- встроенная модульная система компонентов;
- проблемы при подключении внешних библиотек (что необходимо для 2D-разработки на Python).
Это неплохой инструмент разработчика игр. По нему создано множество уроков и имеется огромное количество документации, в том числе и на русском языке.
Разработки через библиотеки Python – лучшие библиотеки
Далее будет сделан акцент на разработке игрового программного обеспечения через библиотеки (они будут в тексте называться движками). Это оптимальное решение как для новичков, так и для опытных разработчиков. Ниже – лучшие библиотеки, которые помогут создавать 2D-игры.
Adventure lib
Adventure lib – библиотека Python, позволяющая писать текстовые игры и интерактивные истории. Данный модуль хорошо подходит для консольного программного обеспечения за счет широкого выбора встроенных инструментов. С его помощью удастся детально проработать все элементы проекта: от персонажа до игровой логики.
Adventure lib предусматривает открытый исходный код. Для него не нужно писать парсеры языка. Все это гарантирует более простое взаимодействие с движком.
Ren’Py
Ren’Py – библиотека, которая подойдет для написания 2D-новелл. Это еще один распространенный жанр 2D-игр. В таком программном обеспечении огромное значение имеет сюжет, а визуальные составляющие и звуки лишь дополняют его.
Ren’Py выделяется:
- кроссплатформенностью – данная среда ориентирована на написание игрового контента для разных устройств;
- множеством инструментов;
- наличием огромного количества уроков и туториалов по ее использованию.
Ren’Py – это не классическая Python-библиотека. Она представляет собой преимущественно готовую среду игровой разработки. Установка данного продукта будет производиться не через pip install. Для ее работы необходимо инициализировать SDK Ren’Py.
Panda 3D
А вот движок, который подойдет для реализации 3D-игр. Речь идет о Panda 3D. Он предусматривает множество полезных инструментов программирования, а также идеально сочетается с различными операционными системами.
Panda 3D – это не просто библиотека, а полноценная платформа для игрового контента и всевозможных приложений. Она поддерживает интеграцию с различными библиотеками, благодаря чему работать с ней очень легко. Правда, для 2D-игр этот вариант подходит не лучшим образом.
PyCharm
PyCharm – полноценная среда разработки на Python. Она поддерживает все необходимое для разработки, отладки и тестирования программного обеспечения. Стандартные возможности PyCharm расширяются за счет плагинов.
PyCharm работает на Windows, macOS и Linux. Она имеет платную и бесплатную версии – остается выбрать подходящий вариант. Для большинства простейших 2D-игр хватит бесплатной.
PyGame
PyGame – основная библиотека, используемая для игровой разработки на Python. Данный движок будет рассмотрен отдельно. Именно на нем предстоит написать первую игру – «Змейку».
Некоторые называют PyGame фреймворком. С точки зрения разработки игрового контента — это не совсем так. PyGame просто имеет характерные черты как библиотеки, так и фреймворка. Он также называется игровым движком – готовым комплексом программного обеспечения для создания 2D- и 3D-игр.
Области использования
PyGame – это фреймворк, ориентированный на создание 2D-игр. В основном – пиксельных и платформеров. Трехмерная графика PyGame поддерживается, но не очень хорошо. Из-за этого сложный AAA-шутер с его помощью запрограммировать не представится возможным.
PyGame подойдет для создания мультимедийных приложений со сложными графическими интерфейсами. Чаще всего фреймворк встречается в игровой разработке:
- при создании небольших инди-проектов;
- для прототипирования более масштабных игр.
Освоить PyGame не составляет никакого труда, поэтому этот движок обычно используется новичками. Он активно применяется в обучении основам игровой разработки. Более опытные программисты тоже могут успешно использовать в своей работе PyGame.
К его преимуществам относят:
- простое освоение;
- быстрый процесс разработки;
- удобное прототипирование;
- возможность работы на любых платформах.
Недостатками PyGame можно считать:
- относительно небольшую функциональность – для крупного игрового проекта эта библиотека не подойдет;
- небольшое сообщество;
- ресурсоемкость – игры на Python отнимают немало компьютерных ресурсов.
Далее предстоит создать первую игру при помощи PyGame. Речь идет о классической «Змейке». Это всего лишь один пример того, как можно использовать рассматриваемый движок на практике с 2D-проектами.
Разработка «Змейки» – пошаговая инструкция
«Змейка» – проект, который часто используется для изучения основ разработки игрового программного обеспечения. Сегодня предстоит познакомиться с ее классической формой представления на основе PyGame.
Правила
Перед программированием проекта необходимо определить игровые правила. В случае с классической интерпретацией «Змейки» они будут следующими:
- змейка будет собирать объекты на игровом поле – ей управляет игрок;
- повороты возможны только на 90 градусов;
- каждый собранный объект будет увеличивать длину змейки на +1 блок;
- при каждом запуске змейка появляется в случайной области имеющегося игрового поля;
- если змейка сталкивается со своим телом или границей поля, игра заканчивается – пользователю засчитывается проигрыш;
- цель – как можно дольше продержаться в раунде и собрать максимально возможное количество объектов.
Управление будет осуществляться при помощи «стандартных» клавиш – WASD. Это связано с тем, что данные кнопки часто используются в игровых проектах. Пользователям не придется привыкать к ним с нуля.
Создание проекта и импорт библиотеки
Весь процесс разработки «Змейки» на PyGame будет разбит на несколько шагов. Этот прием позволяет быстрее освоить упомянутую библиотеку, а также отследить появление новых функций.
Начать предстоит с создания нового проекта в редакторе кода. Для этого рекомендуется использовать PyCharm. VS Code тоже подойдет для реализации поставленной задачи.
Сначала программист должен:
- Запустить среду разработки.
- Выбрать File – New Project.
- Указать имя проекта и задать место хранения исходных файлов (директорию). В рассматриваемом случае проект будет называться snake, а хранится он в стандартной папке. Остальные пункты рекомендуется для начала оставить в состоянии «по умолчанию».
- Перейти в файл main.py. Если он отсутствует – нужно создать его.
- В самом начале соответствующего документа необходимо осуществить импорт библиотек для дальнейшей работы. Предстоит использовать Pygame для доступа к основным модулям Pygame и Randrange – для выбора случайного числа из заданного диапазона.
Вот код, который поможет добиться желаемого результата:
# Импортируем библиотеки
import pygame as pg
from random import randrange
Соответствующий фрагмент кода должен быть вставлен в качестве первых строк main.py. Запись с решеткой не является обязательной. Это комментарий, который сделает исходный код более объемным, но пояснит, за что отвечает тот или иной блок кода.
Константы и переменные
Теперь можно начать активную работу с PyGame. Необходимо создать переменные. Некоторые из них будут константами – они являются постоянными во всем проекте. Сюда относятся размеры окна в пикселях, а также частота кадров (FPS).
Задавать константы рекомендуется сразу после импорта PyGame и других библиотек. Пишутся они в Python заглавными буквами. Если в названии более одного слова, нужно отделять слова друг от друга символом нижнего подчеркивания.
В «Змейке» будут такие константы:
- WINDOW – отвечает за размер окна (равен 1000 пикселей);
- FPS – кадровая частота (60 кадров в секунду).
Вот наглядный пример того, как это будет выглядеть в программном коде на PyGame:
После этого в процессе разработки игрового контента при помощи PyGame необходимо проинициализировать игровые объекты. Для этого сначала создается экранный объект через функции set_mode модуля display.
Set_mode принимает три аргумента:
- размер окна;
- глубину цвета;
- флаги дополнительных параметров.
Последние два параметра могут быть заданы позже. В проекте «Змейка» на PyGame будет задано окно размером 1000 на 1000 пикселей. Константа уже есть. Ее просто необходимо умножить на 2. После этого предстоит сразу инициализировать объект, который поможет задать в проекте на PyGame частоту обновления экрана.
Можно переходить к следующему этапу – формирования игрового окна.
Создание окна проекта
Проекты на PyGame будут работать в рамках бесконечного цикла. Он существует до тех пор, пока пользователь не закроет игровое окно. В соответствующем цикле поддерживаются другие условия и циклы, используемые для управления, обновления экрана и отрисовки объектов.
Необходимо создать цикл while True, а в нем установить ограничение частоты кадров, задействовав FPS:
Теперь необходимо получать события и обрабатывать их. Для этого нужно создать for-цикл и с его помощью отслеживать пользовательские действия, а затем реагировать на них. Сразу же предстоит прописать обнаружение закрытия окна. В этом случае, если объект PyGame закрывается, окно игры тоже закрывается.
Далее необходимо воспользоваться функцией fill() для закрашивания ранее созданного экрана PyGame самым светлым цветом палитры. Этот прием даст возможность размещения в программном продукте более темную змейку и элементы, которые она будет собирать. Цвет будет указан в RGB-формате.
В самом конце предстоит добавить в разработку на PyGame функцию обновления экрана – flip().
Создание змейки
Следующий этап программирования на PyGame – это создание змейки. Чтобы она могла передвигаться, необходимо воспользоваться координатами. В коде поддерживается константа WINDOWS – она обозначает размер одной стороны окна. Теперь можно задать контакты FILE_SIZE – для размера стороны одной плитки сетки. После – задать сразу всю сетку.
Далее – через кортеж предстоит внести в константу RANGE разметку всего поля. Это позволит задавать змейке координаты для передвижения и спауна «корма».
Далее предстоит:
- Создать функцию PyGame, которая будет определять координаты случайной плитки на поле.
- Обозначить лямбда-функцию get_random_position(). С ее помощью и через константу RANGE удастся получить координаты X и Y.
- Поставить префиксную запись – «звездочку». Она укажет на то, что в функцию randrange() нужно передать все кортежные элементы.
Выглядит это так:
Остается нарисовать змейку и задать ей параметры. Сначала создается переменная snake. В ней определяется голова змеи – через экземпляр класса Rect(). Он в PyGame отвечает за обозначение прямоугольной области. В виде параметров в классовый конструктор будут переданы координаты X и Y, высота и ширина. Сразу после этого задается случайная позиция головы змеи в проекте на PyGame на сетке игрового поля. Для этого используется функция get_random_position().
Далее нужно создать переменные для хранения длины змеи и ее сегментов – length со значением 1 и список segments (в нем размещается первый сегмент).
А вот код, с помощью которого можно отобразить змейку на экране. Пусть она будет зеленой, но более темной.
При каждом запуске программного продукта на PyGame теперь будет появляться голова змейки в случайном месте поля.
Управление
В качестве управления в «Змейке» на PyGame будут использоваться клавиши:
- W – вперед;
- A – поворот влево;
- S – назад;
- D – поворот вправо.
Сначала нужно:
- Вернуться к коду, где задавались параметры змейки.
- Создать переменную snake_dir для сохранения координат головы.
- Задать значение (0, 0).
- Задать в коде на PyGame обработку нажатий клавиш. Делается это в разделе цикла обработки событий. Нужно указать значения переменной snake_dir при нажатии.
Выглядит это так:
На каждом шаге змейка перемещается на один сегмент. Из списка сегментов каждый раз убирается лишний:
Вот код, который поможет контролировать скорость движения:
А теперь остается модифицировать часть кода с управлением:
Проект на PyGame почти готов. Осталось несколько простых шагов.
Добавление еды
Еда для змейки по своим размерам идентична голове змеи сразу после запуска раунда. Можно создать переменную food с копией головы змеи. Food будет назначена случайная точка для появления. Для этого используется функция get_random_position():
Еда отобразится на экране более темным цветом зеленого:
Теперь можно научить змейку кушать. Нужно создать условие, в котором проверяется положение головы. Если оно совпадает с едой, задается новое положение для еды, а длина змеи увеличивается на +1.
Выше – пример соответствующего кода на PyGame.
Столкновение
Последний шаг – определение столкновений. Программисту предстоит проверять положение координат головы змеи и размеров окна. Если она соприкасается с границами:
- устанавливаются новые случайные позиции для головы и еды;
- размер змеи уменьшается до исходного;
- координаты передвижения обнуляются.
Выглядит это так:
Змейка в PyGame может столкнуться со своим телом. Это тоже должно привести к концу игры. Для реализации соответствующей задачи создается переменная snake_collision. Она определяет факт пересечения хоть одного прямоугольника тела змеи с ее головой. Лучше всего воспользоваться для ее реализации готовой функцией collidelist() класса Rect из PyGame. После этого предстоит добавить переменную в условие проверки столкновения с границами.
Вот и все. Классическая «Змейка» на PyGame готова. Ее исходный код включает в себя всего 78 строк. Лучше изучить PyGame, Python и игровую разработку помогут дистанционные компьютерные курсы.
Интересует Python? Добро пожаловать на курс в Otus!