Продолжу
В общем, решил я сделать небольшую игру и выложить ее на Я.игры.
Вдохновение пришло от, думаю многим знакомой, игры Battle-Сity на NES (aka Dendy). Хотелось сделать мультиплеер, что бы люди могли ностальгируя сражаться на танках среди кирпичных джунглей.
Сначала нужно было решить что и как делать. Между 2D и 3D выбор пал на три измерения, с одной стороны устройства сейчас достаточно мощные что бы нормально рендерить примитивную 3D графику и даже в браузере это должно работать хорошо, да и у меня моделировать выходит лучше чем рисовать.
Базовые механики дались на удивление не сложно и сделал я их достаточно быстро. Танк который может ехать и вращаться (управление "танковое"), при нажатии на клавишу - выстрел снарядом, когда снаряд с чем-то сталкивается он взрывается, чекает в некотором радиусе объекты, и пытается нанести им урон (в том числе и другим снарядам). Стены сделал уничтожаемыми постепенно, сделал высоту стены пропорциональной количеству оставшейся прочности.
Намерился переходить к сетевому взаимодействию, но оказалось что для мультиплеера нужно будет изрядно подправить код. Первое с чем пришлось разбираться это @rpc, что дословно означает удалённый вызов процедур. Переписал код так, что бы клиенты вызывали методы у сервера, а сервер вызывал их у соответствующих танков (тогда ещё кубиков) для всех клиентов. Сначала все шло хорошо, и казалось что уже можно переходить к созданию и добавлению моделек и эффектов, но во время одного из тестовых запусков обнаружилось, что на некоторых клиентах функция запускается по два раза, и одновременно вылетает два снаряда, которые в итоге наносят двойной урон. Попытки исправить это заканчивались одним из следующих вариантов: снаряд не вылетает у того кто стреляет, т.е. в его клиенте снаряд не вылетает, зато вылетает у других, снаряд вообще вылетает только у сервера, или только у того кто стреляет, или снова у всех всё вылетает, но х2.
Видимо не судьба
Устав от попыток исправить сетевые проблемы, принял решение делать сингл. Идея почти как в бессмертном оригинале: спавнятся вражеские танки и едут уничтожать базу и игрока за компанию. ИИ сделал простейший, вражеский танк сканирует некоторый радиус вокруг себя, фиксирует возможные цели (игрок и база), и едет к тому кто ближе, если перед ним на некотором расстоянии препятствие (стена, игрок или база) с некоторым интервалом он стреляет.
Для того что бы управлять спавном вражеских танков сделал спвнер. Оказалось очень не удобно управляться с невидимыми сущностями по типу спавнеров, т.к. пока не выберешь в дереве объектов, их просто не видно в окне редактора. Для того что бы видеть такие объекты сделал объект Gismo который состоит просто из спрайта со скриптом, в котором прописано удаление на старте, в итоге в редакторе иконки видно, а в игре нет (на самом деле на первом кадре игры может быть видно, особенно в браузере). Сделал иконки для спавнеров врагов.
Позапускал потестировал и понял, что как-то скучно, и со временем здоровье заканчивается, и кирпичные стены разрушаются, а т.к. врагов становится всё больше, долго удерживать оборону не получится, решил добавить подбираемые предметы, восстанавливающие стены и чинящие танк, и спавнер для них.
Наклепал модельки танков вдохновляясь советстким Т-34 и немецким panzer. Сделал базу в виде постамента со звездой. Используя стандартные Godot'овские системы частиц сделал некое подобие взрыва для снарядов.
Заменил разноцветные кубики на свежесозданные модельки, отладил код. Немного допилил управление, сделал инверсию направлений при движении назад. Пришло время делать GUI.
Всё по гую
В Godot есть система тем с редактором, с его помощью сделал тему для контроллов и лейблов, нашёл более-менее приятный свободнораспространяемый шрифт и подключил к теме.
Когда мне показалось что игра по сути готова, отправился смотреть что нужно для того что бы выложить игру на Я.игры.
Почитав условия я выяснил, что одно из условий подключить js файл предоставляемый яндексом, библиотека с API Я.игр - YandexSDK. Повезло что для экспорта под браузеры в движке Godot есть возможность указать подключаемые скрипты, но этого мало, нужно же ещё как-то взаимодействовать с этим скриптом из кода игры. Тогда я не знал что для этого есть плагин, и по тому писал всё взаимодействие сам. Главное было получить доступ к глобальному объекту и там поймать глобальную переменную ysdk, написать обёртки для вызова нужных функций и дело в шляпе.
Пробую отправить
При заполнении черновика игры выяснилось что нужны не только название и описание, но и иконка, карточка, скриншоты и видео с геймплеем. Заполнив все поля черновика я наконец-то загрузил архив с игрой и отправил черновик на модерацию. На удивление ответа не пришлось ждать долго:
Что-то не так оказалось с подключением SDK. Не сразу сообразил как это дело можно отлаживать, но потом заметил что загруженную игру можно запустить уже в окружении яндекса и там скрипт уже работает (в отличии от локально поднятого сервера). Обмазав javascript часть console.log'ами и gdscript часть print'ами, полез разбираться что не так. Проблема была в несвоевременном обращении к ysdk, добавив setTimeout и подобрав подходящее время, снова загрузил архив в черновик и отправил его на модерацию. В этот раз проверка заняла чуть больше времени.
Оказалось что иконка которую я добавил не соответствовала правилам, и прогресс пренепременно нужно сохранять если он предусмотрен игрой. Иконку исправил быстро, чуть дольше провозился с настройкой сохранения прогресса. Дубль 3.
Из звуков в игре был только взрыв снаряда. Так и не разобравшись как предотвратить воспроизведение звука в фоне, было решено совсем убрать звук. Дубль 4. Каждая последующая модерация длилась всё дольше. В итоге через 10 дней я увидел это:
Катарсис. Я был невероятно рад этому письму. Я добавил в закреплённые вкладки страницу с метриками и стал следить. Первые пару дней онлайн был высоким (ну по сравнению с 0), десятки человек в день, но это продлилось не долго, со временем онлайн стал падать, немного задержался на отметке 23, затем упал до 5. Появилось два положительных отзыва с максимальной оценкой. Позже осталось всего 2 игрока. Через пару месяца пришло письмо:
Игра в итоге пропала из выдачи. За время пока она там была итоговый заработок составил порядка 60 рублей, при том что минимальная для списания сумма 1000. Как можно понять денег я не заработал, но получил опыт, и понял что сделать игру в которую смогут поиграть люди я могу, и решил продолжить попытки.
Сейчас думаю стоит ли освежить игру и снова выложить на просторы Я.игр. Вообще у меня есть ещё 2 игры которые прошли примерно такой же путь и куча недоделанных, о них напишу уже в другой раз.