GameMaker это довольно популярный движок для разработки 2D (хотя иногда и 3D) игр.
Примеры игр которые сделаны на GameMaker: Undertale, Deltarune, Nuclear Throne, Hyper Light Drifter, Mondealy. Больше игр можно посмотреть у них на сайте.
Начиная с версии движка 2.3.1.406 разработчики добавили возможность запускать Linux версии игр на ARMv7 и ARM64, так как Repka Pi 3 использует процессор Allwinner H5 на архитектуре ARM64 это значит что GameMaker игры можно более менее нативно запускать на “репке”, но не всё так просто…
Методы сборки игры #
У GameMaker есть два метода сборки игры, VM и YYC:
VM: Код игры собирается в байткод для виртуальной машины GameMaker, как в Java или .NET. Это значит что сам exe игры не содержит кода игры, а по сути является интерпретатором, что позволяет запускать игру на других платформах с помощью такого же exe но на другой платформе, например на Repka Pi 3.
YYC: Код игры переделывается в (довольно уродливый) C++ и собирается компилятором (как правило clang++) в нативный для платформы код. YYC игры работают быстрее чем на VM, но такие игры нельзя запустить на другой платформе просто скопировав exe, т.к. код игры тоже содержится в exe. То есть такие игры нельзя запускать на ARM если разработчик предварительно не собрал сам свою же игру под ARM через YYC. Такой вариант предпочтителен для экспорта на игровые консоли по понятным причинам и соображениям безопасности.
Графический API #
GameMaker на Windows использует Direct3D 11, на Linux - OpenGL 2+, на Android - OpenGL ES, на HTML5/WASM - WebGL, на консолях используются проприетарные API для каждой конкретной консоли.
К сожалению даже в Linux ARM версии GameMaker использует обычный OpenGL, а не ES который предпочтителен для одноплатных компьютеров, что делает запуск игр на одноплатнике немного медленной но всё равно возможной задачей, 240 FPS конечно ожидать не стоит но минимум 30 будет.
И как же всё таки поиграть? #
Я уже сделал готовый набор скриптов который соберёт GL4ES (транслятор OpenGL в OpenGL ES) и установит необходимые зависимости для запуска GameMaker рантайма, вам останется только скачать нужную версию под конкретную игру и запустить саму игру, в качестве примера рассмотрим игру DELTARUNE Chapter 1&2 Demo скачайте Windows версию в какую-нибудь отдельную папку.
В терминале вводим следующие команды:
git clone --depth=1 https://gitflic.ru/project/nkrapivin/repkacompat.git
cd repkacompat
./build_all.sh # эта команда займёт много времени, дождитесь завершения!
Это соберёт основной набор, дальше нужно подготовить саму игру, выполните эти команды в папке со скачанным архивом игры:
unzip 'DELTARUNE Chapter 1&2 (Windows 1.10).zip'
rm 'DELTARUNE Chapter 1&2.lnk'
mv 'DELTARUNE Chapter 1&2 Data' 'assets'
mv assets/data.win assets/game.unx
rm assets/*.exe
find assets -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
Последняя команда переименует все файлы в папке assets
в нижний регистр с помощью утилиты rename
(её должен был установить скрипт build_all.sh
из repkacompat), так как GameMaker на линуксе все имена файлов по умолчанию переделывает в нижний регистр в отличии от Windows.
Структура файлов игр у GameMaker на Windows и Linux немного отличается, например на Windows:
Папка с игрой\
--Исполняемый файл.exe
--data.win
--options.ini
--audiogroup*.dat (опционально)
--прочие файлы
И на Linux:
Папка с игрой\
--Исполняемый файл (для armv7, arm64 или x86_64)
--assets\
----game.unx (он же data.win на Windows)
----options.ini
----audiogroup*.dat (опционально)
----прочие файлы (все в нижнем регистре)
Теперь нужно скачать сам рантайм, посмотреть какую версию нужно скачать можно с помощью UndertaleModTool, откройте data.win на Windows в этой программе и посмотрите на заголовок окна:
Если во время загрузки файла вы видите окно предупреждения про YYC значит игру к сожалению запустить не выйдет. Здесь видно что нужен рантайм версии 2022.1, давайте его скачаем, в папке с repkacompat
выполните ./gmruntimetool.py
:
root@Repka-Pi:~/games/dt2# cd ~/repkacompat/
root@Repka-Pi:~/repkacompat# ./gmruntimetool.py
[1]: Release
[2]: Beta
[3]: LTS
Выберите канал:
Вам нужно выбрать канал Release, нажмите 1 и затем Enter. Затем введите цифру для версии 2022.1.1 (на данный момент это 35) и снова Enter, дождитесь завершения скрипта, потом скопируйте runner в папку с игрой:
cp runtime_2022.1.1.483/linux/arm64/runner ~/games/dt2/
Потом запустите runner
через r.sh
:
./r.sh ~/games/dt2/runner
# ИЛИ в папке dt2:
~/repkacompat/r.sh ./runner
После чего игра должна запуститься!
Дальше вам нужно использовать r.sh
для запуска runner
. Либо вы можете сделать ярлык для быстрого запуска игры с помощью опции “Создать значок запуска…” в контекстном меню рабочего стола:
Смотрим на производительность #
В GameMaker есть скрытый debug overlay который позволяет посмотреть FPS и количество текстурных свапов, для его включения нужно отредактировать options.ini
, добавить в секцию [Linux]
параметр Debug=1
, опять же приведу пример на основе DELTARUNE, было:
[Windows]
SleepMargin=20
Usex64=False
[ExecuteShell]
[Easing_and_Tweening]
[ExecuteShell_ch1]
Стало:
[Linux]
Debug=1
[ExecuteShell]
[Easing_and_Tweening]
[ExecuteShell_ch1]
Теперь при запуске игры вы должны увидеть встроенный в движок счётчик производительности:
Супер!