PyGame (Python) как замена VBA (Excel)

Добрый день, господа и дамы.

Так вышло, что изучать программирование я начал полтора года назад из-за необходимости автоматизации процессов на работе. Первым языком, с которым я познакомился, был Visual Basic for Applications (или VBA). Вы можете посмеяться, сказать, что VBA нельзя отнести к полноценным языкам программирования. Спорить не буду.

PyGame (Python) как замена VBA (Excel)

Я изучал VBA самостоятельно и добился, без преувеличения, неплохих успехов. Так как главной страстью моей жизни были и остаются видеоигры, то изучать язык я начал с их разработки. Знаю, это звучит странно, но игры в Excel — вполне реальная вещь. Я очень много раз рассказывал про человека, который сделал в Excel полноценный ретро-шутер, основанный на рейкастинге.

Ссылка на сайт проекта:

В свое время я написал несколько статей, которые были посвящены разработке игр в Excel с использованием VBA:

Все, что я создавал — это просто наработки. Я брал какую-нибудь идею и реализовывал ее в Excel, но никогда не доводил до конца.

В один прекрасный момент я решил разработать полноценную игру. Я создал паблик ВК для публикации отчетов и начал писать игровой движок. Преуспел ли я в этом? Не сильно. Базовыми функциями движок обладал, но дальше этого дело не продвинулось. Моя идея умерла, едва успев родиться.

Это случилось из-за того, что я перестал видеть перспективы. Сперва я двигался вперед, чтобы изучать язык, новые алгоритмы, основы игростроения, но в какой-то момент задумался о выходе в свет и монетизации своей работы. Понятное дело, что разработанная в Excel игра никому нужна не будет, кроме создателя.

Я забросил проект и стал размышлять о том, на какую платформу перейти. Параллельно с VBA я изучал C#, поэтому первым делом решил попробовать себя в Unity или использовать фреймворк MonoGame (на нем, к примеру, написана Stardew Valley). Достаточно быстро я отбросил эту мысль. Использовать готовые движки не хотелось по причине того, что это скучно, а C# я не знал настолько хорошо, чтобы писать на нем свой собственный движок.

Размышления затянулись на несколько месяцев. Я постоянно возвращался к идее закончить проект в Excel, метался между различными вариантами, но не мог определиться. Так продолжалось до тех пор, пока мой друг, который никогда в жизни не программировал, сказал, что изучает Python.

Я слышал много отзывов об этом языке, и не всегда они были положительные, но на следующий день я скачал IDE и приступил к разработке.

PyGame (Python) как замена VBA (Excel)

По поводу Python скажу немного:

  • Это самый простой язык, с которым я имел дело. На усвоение базы у меня ушло три дня дня. Без шуток.
  • Для Python есть очень много легко подключаемых библиотек. Из этого следует, что многие алгоритмы не надо писать с нуля.
  • В языке немного странное объектно-ориентированное программирование. Например, инкапсуляция присутствует только номинально. Конечно, когда разрабатываешь в одиночку, можно обойтись и без этого, но факт есть факт.

Возможности текущей версии движка

Первым делом я подключил библиотеку PyGame. Она похожа на MonoGame для C#, но имеет меньше функций. Например, разработка 3D игры с этой библиотекой практически невозможна, что для, меня, однако, не является минусом.

PyGame (Python) как замена VBA (Excel)

Я прочитал несколько мануалов, нашел официальную документацию и за 15 дней написал скелет игрового движка. По состоянию на сегодня он умеет не очень много, а именно:

1. Отображать игровой уровень.

Все уровни состоят из подуровней. Такую разбивку я сделал «смотря сегодня в завтрашний день». На данный момент слабенький ноутбук может отображать в кадре около 400 объектов без задержек, а достаточно мощный компьютер около 750. В будущем этот показатель будет ухудшаться из-за новых вычислений. При этом, если все объекты находятся на пределами кадра, то задержки отсутствуют.

Каждый объект происходит от базового объекта, который имеет ряд параметров (обязательные: тип, ширина, высота, состояние анимации, путей и т.д.; необязательные: имя анимации, направление и т.д.). Базовые объекты прописаны в файле Obj.thconf. Они едины для всей игры.

Подчиненные объекты прописаны в файлах подуровней с расширением thmap. Могу же я придумать свои собственные расширения текстовых файлов, как настоящий разработчик=). Они тоже имеют собственные параметры (положение X, положение Y, слой, параметры анимации, параметры путей и т.д.). Все параметры базового объекта можно переопределить в подчиненном объекте.

Например, обычный объект пола представлен в следующем виде.

Базовый объект:

_START _DEFAULT_FLOOR anim_name _F_GRASS_ANIM type floor width 64 height 64 solid 0 direction 0 anim_state 0 path_state 0 _END _DEFAULT_FLOOR

Подчиненный объект:

_START _DEFAULT_FLOOR x 128 y 128 layer 1 anim_state 1 anim_speed 5 anim_cycle 1 anim_dir 1 path_state 1 path _PL_PATH _END _DEFAULT_FLOOR

Не утверждаю, что все сделал правильно, но мне кажется, что такая система поможет ускорить разработку в будущем.

Все объекты отображаются на экране исходя из размера игровой камеры. Данные о камерах уровня хранятся в файлах CAM.thcam.

2. Анимировать объекты.

Анимация объекта зависит от прописанных в файле Anim.thconf последовательностей анимации, а также направления объекта на плоскости. Все последовательности представлены в следующем формате:

_START _ANIM_PL 1 P_DOWN_1 1 P_DOWN_2 1 P_DOWN_3 3 P_UP_1 3 P_UP_2 3 P_UP_3 _END _ANIM_PL

Цифры перед наименованиями отдельных кадров определяют последовательность анимации для конкретного направления объекта. Анимация может быть зацикленная (например, для движения персонажа), однонаправленная (к примеру, открытие двери), со стандартной отрисовкой кадров или реверсивная.

3. Двигать объекты.

Движение объекта реализовано с использованием полярной системы координат. Когда включается движение конкретного объекта, то нужная функция принимает радиус, направление и скорость (единицы в секунду).

4. Передвигать объекты в соответствии с установленным путем движения.

Все пути движения для объектов указанного уровня прописаны в файлах PATH.thpath в следующем формате.

_START _PL_PATH 1 64 90 32 64 45 32 64 225 32 64 270 32 64 314 64 64 134 64 _END _PL_PATH

Первое число определяет тип пути (циклический или однонаправленный), следующие последовательности определяют радиус, направление и скорость.

Пример

Для теста графического движка я беру (краду) бесплатные спрайты с различных сайтов. На следующем видео оба объекта используют почти все текущие возможности движка (анимация, движение, пути).

Планы

Так как это мой первый опыт разработки подобного движка, то сам процесс хаотичный. Несмотря на это, у меня есть несколько фич, которые я хочу добавить в ближайшее время:

1. Система коллизий (столкновение объектов).

2. Триггеры (например, переход между уровнями, открытие дверей).

3. Из предыдущего пункта следует создание скриптов для подобных действий.

4. Создание системы поиска объекта (например, для обнаружения игрока)

5. Создание системы контролируемых персонажей.

Самое важное — это создание редактора уровней в будущем. Без редактора прописывать объекты с десятками параметров будет сложно.

Следующий важный пункт — поиск людей для помощи в создании спрайтов и звукового сопровождения. На данном этапе это не так важно, потому что движок еще не готов. Возможно, я бы и сам справился с этой задачей, но иногда лучше довериться профессионалам.

Итого

На данный момент реализовано не так много, но предпосылки создания полноценного движка присутствуют. Движок я пишу для своих целей, поэтому он не будет универсальным.

В свое время, когда еще занимался изобретением велосипедов в Excel, я создал паблик ВК и наполнял его информацией о процессе разработки. Сейчас я перепрофилировал его под текущий проект.

Если кто заинтересовался, прошу, проходите по ссылке и вступайте в группу.

На этой ноте я покидаю вас на неопределенный срок. Спасибо за внимание!

1919
12 комментариев

VBA нельзя отнести к полноценным языкам программированияМожно

8
Ответить

К нему бы фреймворки человеческие, а не OLE Automation, можно было бы много чего крутого пилить)

2
Ответить

Комментарий недоступен

1
Ответить

Комментарий недоступен

7
Ответить

Вот блин, забыл эту картинку к статье приложить=)

Ответить

Если отвращение к готовым движкам пройдет, а желание сделать игру нет, рекомендую обратить внимание на Godot. Там используется собственный скриптовый язык, но он брат-близнец питона.

6
Ответить

Попробуйте так же LOVE 2D. Тоже очень простой игровой фреймворк на Lua. По моему мнению Lua намного проще питона, да и в сфере GameDev он сильно распрастранен: многие игры используют Lua как язык для написания модов

1
Ответить