8 доступных игровых движков, на которых можно сделать свою игру

Создание проекта

Создавать нашу игру мы будем в Microsoft Visual Studio 2017. Все инструкции и описания, приведенные ниже, могут быть с легкостью адаптированы и для других версий Visual Studio. Итак, для начала запустите Visual Studio и создайте новый проект. Тип проекта :

Имя задайте . Если вы задали другое имя, отличное от , то имена ваших классов будут немного отличаться от тех, которые будут на этом уроке.

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

Выбирая опцию мы указываем нашему будущему приложению на необходимость использования архитектуры «Document/View». Следующий интересующий нас параметр — , который содержит две опции. Выбор опции подразумевает, что на компьютере конечного пользователя, который будет запускать наше приложение, уже имеются все необходимые для этого MFC-библиотеки. Если же мы выберем , то нужные MFC-библиотеки войдут в нашу программу на этапе компиляции, что в результате приведет к увеличению итогового размера нашей программы, но эта программа будет работать на любой машине с Windows.

Затем в следующих окнах оставляйте всё как есть, пока не доберетесь до окна:

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

Далее мы переходим на страницу :

Отключите опции , . Если есть возможность, то укажите в опции , поскольку мы не будем подгружать в нашу программу какие-либо дополнительные файлы.

Далее рассмотрим последнюю страницу мастера настройки MFC-приложений, на которой можно увидеть список созданных классов:

В результате будут автоматически сгенерированы 4 класса, которые станут основными классами в нашей игре.

К классу мы вернемся немного позже. А пока рассмотрим класс , который является классом-обёрткой для всего нашего приложения и функции main() в том числе. Базовым для него всегда будет класс .

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

И, наконец, класс , базовым для которого будет . Он также является классом-обёрткой для окна нашей программы. Класс основного фрейма содержит меню и представление клиентской области. Клиентская область — это место, где отрисовывается наша игра.

Теперь возвратимся к пропущенному ранее классу — базовый класс, который представляет собой раскрывающийся список с набором общедоступных представлений, каждое из которых имеет свои особенности в использовании и применении. Тип представления по умолчанию — , который является общим представлением, где все отображения и взаимодействия с пользователем должны выполняться вручную. Это как раз то, что нам нужно.

Сейчас быстренько пройдемся по списку и поговорим, для чего используется каждый тип представления:

    — это общее представление, которое состоит из простого текстового поля.

    — позволяет разработчику вставлять в него другие основные элементы управления, т.е. поля редактирования, поля со списком, кнопки и т.д.

    — имеет HTML-редактор, встроенный в представление.

    — вставляет элемент управления — браузер Internet Explorer.

    — имеет область, похожую на окно Проводника со списками и значками.

    — похож на редактор WordPad; позволяет не только вводить текст, но и форматировать его, изменять цвет и тому подобное.

    — это общее представление, похожее на , но допускающее прокрутку.

    — вставляет элемент управления древовидной структурой.

Завершение работы мастера приложений MFC приведет к созданию и запуску приложения MFC. Поскольку мы еще не написали никакого кода, то увидим окно, в котором ничего нет, но все равно это полностью функционирующее приложение. Ниже приведен скриншот того, как должно выглядеть ваше базовое приложение (чтобы скомпилировать программу, нужно перейти в меню Visual Studio ):

Обратите внимание, здесь есть стандартное меню (, и ) и пустая клиентская область. Прежде, чем мы перейдем к непосредственному написанию кода, мы немного поговорим об архитектуре «Document/View», которая используется в приложениях MFC, и о том, как мы собираемся применять её в нашей игре

Изменение размера консоли

По умолчанию у меня в консоли помещается 80 символов в высоту и 50 в ширину. Это примерно треть моего экрана, поэтому захотелось увеличить количество символов в строке консоли хотя бы до 200.

Изменение размера окна консоли тоже оказалось задачкой с подвохом. Первый запрос был тривиальным «c++ change size of console window». Первый ответ на него подробно объяснял как сделать это с помощью настроек окна консоли на уровне операционной системы. То есть не из самой игры, а со стороны пользователя. Прикладывать эту инструкцию к игре я посчитал неправильным. Нужен способ сделать это из самой программы. Второй и последующие ответы описывали изменение размера окна консоли с помощью функции MoveWindow. Фактическое количество текста при этом не менялось. Если окно становилось слишком маленьким, то появлялись полосы прокрутки.

Следующая попытка была «c++ set console size». Два первых ответа вели на известные советы с функцией MoveWindow. Зато дальше пошли ссылки на документацию. А именно — на функцию SetConsoleScreenBufferSize. Судя по описанию, она меняет не размер видимого окна, а внутренний размер буфера. В качестве аргументов она принимает поток вывода и структуру с желаемыми размерами буфера.

На тот момент я не знал точно, какие размеры стандартные и что я могу туда поставить. Поэтому указал 20 на 20. Для проверки размеров окна я также вывел прямоугольник из цифр от 0 до 9 шириной 20 на 20. Получился вот такой код:

Заполнение экрана символами и изменение размера консоли

Вывод получился вот таким

Поскольку это работа на уровне WinAPI, в результате получился код ошибки. Я в основном работаю с java стеком и обычно вижу стектрейсы и тексты исключений. Несмотря на это, принцип решения проблемы не изменился. Для расшифровки кода ошибки нужно воспользоваться официальной документацией. Она легко ищется запросом «getlasterror error codes». Кодов ошибок описано около девяти тысяч на нескольких страницах. Для моего случая подойдет первая страница https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes—0-499-

Ошибка гласит ERROR-INVALID-PARAMETER 87 (0x57) The parameter is incorrect.

Маловато объяснений. Тогда я проверил как другие пишут этот код. Запрос «SetConsoleScreenBufferSize incorrect argument» привел меня вот на этот вопрос на SO https://stackoverflow.com/questions/12900713/reducing-console-size

В ключевых аспектах код ответа был похож на мой

Но в нем содержалось важное дополнение «If you call SetConsoleScreenBufferSize with illegal value in COORDS (e.g. too little height/width) then you get an error, usually 87 ‘invalid argument’.»

Потом я посмотрел в документацию к функции SetConsoleScreenBufferSize https://docs.microsoft.com/en-us/windows/console/setconsolescreenbuffersize и увидел что на размеры буфера наложены ограничения. Получается, что я передал слишком маленькие значения. У меня не было необходимости перебирать значения для получения точных минимальных размеров. В конце концов цель — увеличить размеры буфера, а не уменьшить. Поэтому показалось логичным отталкиваться от текущих размеров окна. Раз у нас есть функция SetЧтототам, значит должна быть и функция GetЧтототам. GetConsoleScreenBufferInfo действительно нашлась https://docs.microsoft.com/en-us/windows/console/getconsolescreenbufferinfo С помощью неё и отладчика MSVS я выяснил, что размеры буфера на моей машине по умолчанию 80 на 50. Ширину я увеличил примерно в три раза, а высоту в полтора. При инициализации структуры size значением X = 200 и Y = 80 в высоту появились полосы прокрутки. Здесь и пригодилась функция MoveWindow.

Исходный код был видоизменен вот так:

Вывод при этом получился таким

Ресурсы 🎁

Выбор игрового движка:

1) Вы можете написать свой собственный движок! Требуются знания C/ C++ на низком, системном уровне.

2) Unity — кросс-платформенный, поддержка 2D/3D. Требуются знания Javascript / C # уровня middle.

3) Unreal Engine — кросс-платформенный движок, поддержка 2D / 3D (2D плохо поддерживается). Требуются знания C ++ уровня middle.

4) pixi.js — поддержка 2D. Требуются знания Javascript уровня middle.

5) GameMaker Studio — кросс-платформенная программа, поддержка 2D / 3D. Требуются знания GML начального уровня.

6) Corona — фреймворк, кросс-платформенный. Требуются знания Lua начального уровня.

Совет №3. Соберите прототип и покажите его друзьям

«Не откладывайте на потом практическую часть», — рекомендует Кирилл Золовкин. Как только вы немного разобрались в движке, пришло время делать прототип — модель будущей игры, предназначенную для тестирования игровых механик.

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

Замечательная серия видео от Extra Credits по теме

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

Позиционирование текста

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

  • Console.SetCursorPosition() устанавливает курсор в выбранную позицию консольного окна;
  • свойство Console.CursorLeft возвращает или устанавливает курсор в заданную колонку:
  • свойство Console.CursorTop возвращает или устанавливает курсор в заданную строку.

Эти два свойства используются, когда необходимо сохранить текущую позицию при записи текста в другую позицию экрана, чтобы снова вернуться в начальную позицию. Просто сохраните значения свойств CursorLeft и CursorTop, выполните некоторые действия, а затем установите их обратно (или используйте SetCursorPosition(), которая делает то же самое, что установка этих свойств), чтобы сбросить позицию.

Вот простая программа, которая делает именно это. Я прошу вас создать новое консольное приложение в Visual Studio и вставить код в свой Main() метод. Но поскольку мы говорим о консольных приложениях, я думаю, что полезно, чтобы вы фактически создали файл с нуля без Visual Studio, потому что это дает больше понимания о консольных приложениях. Вот что нужно сделать:

Сперва, откройте блокнот и вставьте в него следующий код:Файл PositionText.cs:

 

Играем стильно

Если бы вы загрузили эту страницу, то ничего не увидели бы, потому что никакого стиля не применено. Я уже подготовил ссылку на файл main.css в своем HTML, поэтому помещу все CSS в новый файл с тем же именем. Первым делом я позиционирую все элементы на экране

Тело страницы должно занимать весь экран, поэтому сначала я уделяю внимание этому:

Во-вторых, мне нужно, чтобы арена была заполнена фоновым изображением (рис. 3):

Рис. 3. Фоновое изображение для арены

Далее я размещаю табло. Я хочу, чтобы оно находилось вверху по центру — поверх других элементов. Команда «position: absolute» позволяет разместить его где угодно и оставить там: 50% — позиционирует табло посередине верхней части окна, но начиная с самой левой части элемента табло (scoreboard element). Чтобы гарантировать точную центровку, я использую свойство transform, а свойство z-index обеспечивает, что табло будет всегда находиться поверх других элементов:

Я также хочу использовать текст со шрифтом в стиле ретро. Большинство браузеров позволяет включать собственные шрифты. Я счел подходящим шрифт Press Start 2P от codeman38 (zone38.net). Чтобы добавить шрифт к табло, я должен создать новое начертание шрифта (font face):

Теперь результаты (scores) находятся в теге h1, поэтому я могу задать этот шрифт для всех тегов h1. На случай отсутствия этого шрифта я предусмотрю несколько запасных вариантов:

Для других элементов я буду использовать таблицу изображений-спрайтов. Таблица спрайтов (sprite sheet) содержит все необходимые игре изображения в одном файле (рис. 4).

Рис. 4. Таблица спрайтов для Ping

Зачастую, прежде чем создавать игру, лучше всего нарисовать то, как она должна выглядеть.

Любому элементу, имеющему изображение в этой таблице, будет назначен класс sprite. Тогда для каждого элемента я буду использовать background-position, чтобы определить, какую часть таблицы спрайтов мне нужно показывать:

Затем я добавлю класс sprite ко всем элементам, которые будут использовать таблицу спрайтов. Для этого мне придется ненадолго переключиться на HTML:

Теперь мне нужно указать позиции каждого спрайта в таблице для каждого элемента. И вновь я буду делать это с помощью background-position, как показано на рис. 5.

Рис. 5. Добавление смещений для таблицы спрайтов

Свойство position: absolute в player, opponent и ball позволит мне перемещать их по полю, используя JavaScript. Если вы посмотрите на страницу теперь, то увидите, что к элементам управления и мячу прикреплены ненужные куски. Дело в том, что размеры спрайтов меньше 128 пикселей по умолчанию, поэтому я подстраиваю их под правильный размер. Мяч всего один, и я задаю его размер напрямую:

Элементов управления четыре (кнопки, которые пользователь может нажимать для перемещения своего игрока), поэтому мне следует создать для них специальный класс. Я также буду добавлять некий зазор, чтобы вокруг них было небольшое свободное пространство:

После добавления этого класса элементы управления в игре выглядят гораздо лучше:

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

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

Мотивация

Зачем так делать?

Чтобы научиться программировать. А точнее — чтобы научиться переносить человеческие мысли в код. Обычные задания по программированию плохо тренируют этот навык потому что они скучные. Признаюсь честно, я намеренно готовил скучные задания для своих студентов. Нудные задания на превращение двух чисел в третье неизбежны, чтобы освоить базовые концепции. Такие задания помогут вам спуститься по горной реке, заполненной острыми камнями синтаксиса и водоворотами новых концепций. Проблема в том, что простые понятные задания однажды бросят вас в бескрайнем океане возможностей. Тогда вы обнаружите, что можете плыть куда угодно. Однако никто не подскажет вам верное направление. Ни одна платформа с автоматической проверкой решений не сможет проверить творческую работу и поставить оценку. Это может сделать либо живой преподаватель, либо живой напарник.

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

Почему C++?

Главная причина в том, что я сейчас веду индивидуальные занятия по C++ у одного талантливого студента. Его успехи вдохновили меня, а его вопросы показали о чем вообще нужно написать. C++ до сих пор рекомендуют как «язык для обучения». Это вселяет надежду, что статья будет полезна многим. Может быть когда-нибудь я напишу такую же статью и для других языков или для Linux, но не рассчитывайте на это. Если вы напишете сами подобный сборник советов для другого языка, то сообщите мне личным сообщением. Я добавлю ссылку на ваш труд.

Что нужно знать, чтобы понять статью?

Если вы понимаете концепцию циклов, массивов и функций, то вам должно быть достаточно. Предупреждаю сразу, в статье будут магические конструкции, которые я не буду объяснять. У меня нет цели сделать всеобъемлющий курс по C++. Цель — писать код и радоваться тому, как оно почти магически заработает. Когда закончите с основной целью или когда встретитесь с непреодолимыми проблемами, тогда и углубляйтесь.

Game Maker Lite

Game Maker — один из самых известных конструкторов игр, ориентированный на создание двухмерных игр практически любых жанров и уровня сложности. Программа обладает встроенными редакторами спрайтов, объектов, сценариев и комнат, а также позволяет задавать последовательность действий с привязкой ко времени и маршруту движения.

Game Maker отличается тем, что для создания игр в нем не нужно знания каких-либо языков программирования, хотя возможности использования скриптов также присутствует.

Поэтому его также можно рекомендовать для начального обучения программированию.

Основные возможности Game Maker:

  • Простой и интуитивно понятный интерфейс программы.
  • Встроенные уроки по созданию первых игр.
  • Программирование с помощью drag-n-drop.
  • Бесплатная коллекция бесплатных изображений и звуков для игр.
  • Возможность создания простых ЗD-игр.
  • Встроенный язык программирования Game Maker Language (GML), позволяющий разрабатывать более функциональные и интересные игры.

Внимание:

Бесплатная версия Game Maker ограниченна в функциональности, а при запуске созданных в ней игр показывается логотип программы.

Популярные язык программирования для создания игр

Язык C# был создан компанией Microsoft, и не очень давно. Но, несмотря на это, он находит своих пользователей и становится все более распространенным благодаря стараниям разработчиков.

C# довольно прост для новых пользователей, в сравнении с тем же C++. Поскольку он появился позже, чем C++, в сферу игровых движков он тоже вошел позже. Однако сейчас он уже часто упоминается среди популярных языков программирования игр и используется в таких движках, как Unity, XNA, Godot и других.

Бесплатный онлайн-интенсив

Ваш Путь в IT начинается здесь

Подробнее

C++

Этот язык уже давно стал одним из основных языков программирования компьютерных игр. В отличие от C#, этот язык не так просто выучить с нуля. Во-первых, он был создан относительно давно и в нем применяются не самые новые инструменты и функции, а во-вторых, для его использования необходимы определенные познания о работе компьютера.

C++ реализован в еще актуальных, но старых движках, однако поколение сменяется, софт развивается и появляются новые языки, которыми проще и удобнее пользоваться. А C++ сейчас используется в движках Source и Unreal Engine, например.

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

Java

Этот язык тоже далеко не самый новый, однако разработчики его все еще обновляют и поддерживают. Его не так сложно выучить, как C++, и в этом он похож на C#, ведь при создании последнего Microsoft, видимо, опирались как раз на Java. Из-за того, что он относительно прост в освоении и популярен, новички часто задумываются о том, чтобы выучить его.

Но на самом деле он почти не поддерживается игровыми движками: в ведущих он вообще не используется, а те, в которых его применяют, довольно сложно освоить. Среди них – Engine, jMonkey, LibGDX.

JavaScript

Важно отличать его от Java!

JavaScript – это отдельный и довольно распространенный язык. Он активно развивается и применяется во многих инструментах для разработки игр, таких как игровые движки и среды разработки PlayCanvas, Pixi.js, Phaser или Cocos2D. Впрочем, они не являются ведущими в сфере.

Если подытожить – лучшим языком программирования для игр, который может быстро освоить новичок, особенно, если он ориентирован в основном на 2D, можно считать JavaScript.

Godot

Движок разработан двумя программистами из Аргентины — Хуаном Линетски (Juan Linietsky) и Ариэлем Манзур (Ariel Manzur) в 2007 году. Несколько лет Godot был основой для внутреннего ПО некоторых латиноамериканских компаний. До того как исходный код движка выложили в открытый доступ, его итерации выходили под разными названиями: Larvotor, Legacy, NG3D и Larvita. Godot до сих пор активно поддерживается благодаря пожертвованиям на Patreon от сообщества, заинтересованного в развитии технологии.


Kingdoms of the Dump — игра, созданная на Godot

Достижения:

  • согласно данным портала itch.io, Godot занимает пятое место среди самых популярных игровых движков, оставив позади себя RPG Maker и Unreal Engine 4;
  • на Godot сделано более 5 000 проектов;
  • в начале 2021 года разработчики получили грант на 120 тысяч долларов от волгоградской студии «KEFIR!».

Преимущества:

  • подходит для 2D-игр;
  • в отличие от Unity, поддерживает систему измерения в пикселях и облегчает создание пиксель-арта;
  • мультиплатформенный редактор (Windows, macOS, Linux) работает в двух режимах — 32 и 64 бита;
  • скрипты реализованы проще, чем в других движках: помимо собственного GDScript, есть полная поддержка C# 8.0, C++, а также визуальное программирование;
  • гибкая система анимации объектов, встроенная в движок;
  • наличие подробной документации в сообществе, а также много полезной информации на reddit.

Недостатки:

  • 2D-физика и тени реализованы хуже, чем в других бесплатных движках;
  • могут возникнуть трудности с перемещением и изменением объектов на уровне;
  • 3D-движок не может конкурировать с более мощными альтернативами;
  • не поддерживает консоли;
  • ограниченная интеграция со сторонним API;
  • отсутствие знаковых хитов.

Игры на движке: Kingdoms of the Dump, The Garden Path, Until Then, Ex Zodiac, GDQuest.

Я заинтересовался Godot, когда искал альтернативу Unity/UE4 c открытым исходным кодом, и начал с ним работать в октябре 2019 года. До этого я делал игры на GameMaker, потом перешёл на Unity, чтобы сделать первую 3D-игру, и продолжал на нём работать, пока не попробовал Godot. Теперь я работаю только на нём. В процессе разработки нередко возникают проблемы с исправлением багов. Некоторые ошибки появляются в самых неожиданных местах, и сложно найти корень проблемы. Ситуацию усложняет скудное и запутанное описание к ним

Я 3D-художник, для меня важно, чтобы 3D-сцены отлично выглядели. Поэтому хотелось бы, чтобы в следующих версиях улучшили возможности графики: физически корректный рендеринг, связанный с динамическим и статическим глобальным освещением, эффекты окружающей среды и постобработки

При этом должны быть хорошая производительность и оптимизация. Об этом стоит задуматься, ведь наличие 4K-дисплея у игрока скоро станет нормой».

Леонардо «Leocesar3D» Велозу (Leonardo «Leocesar3D» Veloso), инди-разработчик (Human Diaspora).

Интервью в марте 2021 года


Human Diaspora

«Каждый день я сталкиваюсь с молодыми людьми, убеждёнными в том, что Unity и UE4 — это единственные движки, которые стоит изучать. Они игнорируют тот факт, что экосистема геймдева разнообразна: игры создаются как на популярных, так и на собственных движках. <…> Godot не конкурирует с другими инструментами, ведь он создан не для прибыли. Мы заинтересованы в том, чтобы мотивировать разработчиков поработать на нём. Это поможет не только развеять мифы о разработке игр, но и увеличит количество людей, активно работающих над улучшением технологии, которая навсегда останется бесплатной для всех».

Райан Хьювер (Ryan Hewer), CEO Little Red Dog Games (Precipice).

«What is the best game engine: is Godot right for you?», апрель 2020 года


Precipice

Solar 2D

Бесплатный фреймворк (набор готовых функций для использования), разработанный в 2009 году. Ранее движок распространялся под названием Corona SDK. Основная цель — создание мобильных и десктопных приложений на базе скриптов Lua. В мае 2020 года в связи с закрытием компании Corona Labs Inc. произошёл ребрендинг, и теперь, как и в случае с Godot, поддержка и развитие движка осуществляется через пожертвования. Есть активное русскоязычное сообщество. Исходный код можно скачать с GitHub.


Game of Sultans — игра созданная на Solar 2D

Достижения:

  • за всё время существования движка на нём создано более  000 приложений на Android;
  • игру Bubble Ball (2010), созданную 14-летним подростком на Solar 2D, скачали два миллиона раз за две недели после релиза на iOS;
  • на Solar 2D также создана Game of Sultans, известная в России как «Великий Султан»: у неё более 10 миллионов загрузок, она лидер по продажам в 2019 году.

Преимущества:

  • возможность быстро разработать проект (скрипты Lua просто освоить);
  • небольшой объём приложений;
  • кроссплатформенность (iOS, tvOS, Android, Android TV, macOS, Windows, Linux, HTML5);
  • поддержка сторонних API и библиотек (C/C++/Obj-C/Java);
  • большое разнообразие плагинов для расширения функциональности.

Недостатки:

  • не поддерживает консоли;
  • позволяет работать только с 2D;
  • нет визуального редактора — только окно со строками кода;
  • не подходит для крупных проектов.

Игры на движке: CarMaker, Game of Sultans, The Lords of the Earth Flame, Incursion Defense: Cards TD, Edorium, Beasts Battle.

«Сообщество Solar 2D хоть и небольшое, но активное. Благодаря открытому исходному коду любой толковый программист может написать плагин к движку и развивать его. Solar 2D подходит для создания небольших казуалок, но при желании можно сделать что-нибудь сложнее. Если сравнивать с движками, которые под силу освоить даже художнику или сценаристу, то у Solar 2D порог входа выше, так как требуются навыки программирования».

Сергей Поморин, инди-разработчик (Beasts Battle, Necromancer Returns, Magicians Legacy)


Necromancer Returns

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector