Как я подключила SDK Яндекса к Construct 3 через JavaScript

Как я подключила SDK Яндекса к Construct 3 через JavaScript

Где-то месяц назад я начала изучать JavaScript. И, конечно, еще не дочитав учебник до конца, я решила подключать SDK Яндекса к своей новой игре. С чего это я вдруг спросите вы, если есть такой удобный Game Push и плагин от самого Яндекса? А я отвечу, что в моей игре нужны были супер частые сохранения (читай минус все деньги, если использовать запросы Game Push), а вот плагин от Яндекса у меня почему-то не захотел работать нормально, как я ни старалась. И поэтому, обладая лишь двухнедельными знаниями о JS, я решила, что я вполне могу подключить это ваш SDK.

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

Загрузка SDK

Итак, начнем с загрузки самого SDK, чтобы у нас была возможность использовать его методы в игре. Создаем новый документ в папке "Scripts", главное тут включить импорт данных в Event Sheets, а то наши переменные и функции не будут доступны в самом Construct.

Настройки в левом верхнем углу 
Настройки в левом верхнем углу 

Дальше надо добавить загрузку SDK, я использовала примеры из документации Яндекса по установке. Выглядит это вот так:

Как я подключила SDK Яндекса к Construct 3 через JavaScript

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

Первая функция грузит скрипт с данными SDK, а вторая же инициализирует YaGames и возвращает объект ysdk, который мы и будем использовать для вызова всех функций. Плюс я задаю переменной sdk значение true, чтобы в игре можно было понять, в какой момент все загрузилось.

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

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

Создаем что-то похожее в самом верху наших events, чтобы все загрузилось сразу при запуске игры
Создаем что-то похожее в самом верху наших events, чтобы все загрузилось сразу при запуске игры

В коде Construct есть волшебное слово runtime, через которое можно получать доступ к переменным и функциям из events. Тут я передаю информацию из скрипта в events через глобальную переменную sdk_loaded, чтобы можно было вызывать наш код только один раз, а не каждый тик.

Когда sdk загрузился, мы вызываем рекламу, подгружаем игрока, получаем язык и грузим очки, если они есть. Вот так выглядят эти функции в скрипте:

Тут можно выключить звук на время рекламы или проверить ее доступность пользователю 
Тут можно выключить звук на время рекламы или проверить ее доступность пользователю 
Загружаем игрока и возвращаем объект player 
Загружаем игрока и возвращаем объект player 
Получаем данные языка и вызываем функцию из events, чтобы обновить весь текст в игре
Получаем данные языка и вызываем функцию из events, чтобы обновить весь текст в игре
Грузим очки, а если их нет, то это первое открытие игры. Тут же я вызвала api_ready(), так как после этого игра готова к взаимодействию.
Грузим очки, а если их нет, то это первое открытие игры. Тут же я вызвала api_ready(), так как после этого игра готова к взаимодействию.

Сохранение данных игрока

Теперь займемся тем, ради чего все и начиналось. Сохранять численные данные игрока Яндекс дает не чаще чем раз в секунду, а если нужно сохранить что-то посложней, то вам дают лишь 100 запросов за 5 минут. Для моих нужд сохранение раз в секунду вполне подойдет:

Сохраняем очки только если они больше предыдущих 
Сохраняем очки только если они больше предыдущих 
Создаем объект с данными игрока, который отправляется на сервер Яндекса и сохраняется там, чтобы игрок не мог рисовать себе очки
Создаем объект с данными игрока, который отправляется на сервер Яндекса и сохраняется там, чтобы игрок не мог рисовать себе очки

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

Проверяем, доступно ли сохранение в лидерборде = авторизован ли пользователь 
Проверяем, доступно ли сохранение в лидерборде = авторизован ли пользователь 

Rewarded Ads - Реклама с вознаграждением

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

Основная функция вызова рекламы
Основная функция вызова рекламы

Пример того, как можно вызвать такой показ рекламы:

При нажатии на кнопку бонуса - открываем меню рекламы и посылаем ее тип 
При нажатии на кнопку бонуса - открываем меню рекламы и посылаем ее тип 
Подгружаем меню рекламы в зависимости от ее типа 
Подгружаем меню рекламы в зависимости от ее типа 
Включаем рекламу и посылаем ее тип в скрипт для последующей выдачи награды 
Включаем рекламу и посылаем ее тип в скрипт для последующей выдачи награды 

Сохранение игры

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

Сохранение и загрузка позиций кристаллов 
Сохранение и загрузка позиций кристаллов 
Создание загруженных кристаллов 
Создание загруженных кристаллов 

На создание игры и подключение sdk у меня ушел где-то месяц. Я работала в свободное время где-то пару часов в день.

Надеюсь, кому-то этот туториал был полезным. Всем 💜

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

Тебя там rust покусал? Ехал var через функцию.

1
Ответить

Нужна пояснительная бригада)

Ответить

Причем тут раст и с каких пор в нем используется ключевое слово var?

Ответить

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

1
Ответить

Все таки констракт выбрала?)

1
Ответить

Пока пробую, в целом все движки похожи, а для изучения геймдева констракт подойдет. И я не забросила Godot)

Ответить