Multiplayer — различия между версиями

Материал из wiki.appsalutecreator.com
Перейти к: навигация, поиск
("Как пользоваться этой штукой?" или базовые настройки для игры с мультиплеером)
 
(не показано 11 промежуточных версий этого же участника)
Строка 88: Строка 88:
 
*'''accept''' - принимает приглашение поиграть
 
*'''accept''' - принимает приглашение поиграть
 
*'''confirm''' - подтвердить свои намерения играть с этим игроком
 
*'''confirm''' - подтвердить свои намерения играть с этим игроком
 +
<br><br>
 +
 +
 +
="Как пользоваться этой штукой?" или базовые настройки для игры с мультиплеером=
 +
Сразу оговорюсь, вся описанная тут информация основывается на личном опыте, своеобразном восприятии и плохой памяти. Возможны неточности или излишняя информация. Так же, на момент написания статьи мультиплеер работает только с [[HiddenList]].
 +
 +
Для примера будет использован проект HiddenBattle.
 +
 +
==Необходимости для игры с мультиплеером==
 +
 +
===Внешние настройки===
 +
* Для начала, нужен рабочий настроенный [[Cloud]]
 +
* Так же, нужно завести игру на мультиплеерном сервере (на 1й этаж) и получить 4 праметра: '''app_multiplayer''', '''key_multiplayer''', '''server_multiplayer''', '''server_websocket''';
 +
* Далее эти параметры необходимо записать в '''.icf''' (app/platform) в раздел [Cloud];
 +
* Ну и, собственно, нужен сам объект Multiplayer.
 +
 +
===Внутренние настройки===
 +
* Объект [[Cloud]]а;
 +
* Экономика > Основные параметры > Мультиплеер - указать объект мультиплеера
 +
 +
'''Настройки хидденлиста под мультиплеер'''
 +
 +
Описание параметров хиденлиста описаны [[HiddenList#Параметры бота и мультиплеера|здесь]] . Так как мы нацелены на игру с живым оппонентом, настройки для бота постараюсь не затрагивать.
 +
<br>
 +
Итак, что нам нужно в HiddenList:
 +
* Общие параметры:
 +
** '''время хода''' - задать -1;
 +
** убрать переходы при разборе и "время вышло"
 +
** задать '''актер бота''' и '''принудительный целевой объект'''
 +
* Хидден бот:
 +
** '''Тип бота''' - на одном поле;
 +
** '''multiplayer''' - указать наш объект мультиплеера;
 +
** '''кнопка хинта''' - сделать отдельную кнопку с отдельным хинтом для оппонента
 +
** при необходимости, нужно заполнить нужные вам счетчики бота (очки, комбо, ...) и указать таймеры хода;
 +
** '''длительность хода''' и '''длительность паузы между ходами''' - обязательные поля.
 +
* Обработчики:
 +
** '''разбор: изменить состояние объекта''' - вызывается мультиплеером при победе игрока;
 +
** '''проиграли боту: изменить состояние объекта''' - вызывается мультиплеером при победе оппонента;
 +
** '''Начало хода игрока''' и '''Начало хода бота''' - если нужно как-то отслеживать смену хода
 +
 +
==Поиск игры==
 +
* Для начала поиска необходимо определиться, во что именно мы хотим играть (выбрать '''seed'''). В моём случае, это номер пака с хидденами и локации в экономике:
 +
[[Файл:Multiplayer_1_seed.png|400px]]
 +
* После выбора пака\игры и соблюдения всех условий, записываем '''seed''' мультиплееру и вызываем ему состояние '''want_game'''. На этом этапе было бы неплохо показать игроку какое-то окно с визуальным отображением ожидания чего-то, но это на вкус и цвет...
 +
[[Файл:Multiplayer_2_waiting.png|400px]]
 +
* При нахождении живого оппонента, мультиплеер вызовет обработчик nst_game_created ('''игра создана''') после которого вы можете делать что угодно (анимации, спецэффектики, свистоперделочки и прочее), но после должны запустить хидден (официально, через экономику, состоянием '''play'''). Экономика сама синхронизирует между игроками уровень в выбранной локации.
 +
* В самой хидден-сцене желательно со старта активировать машинку-блокер с текстом тима "Ожидание ответа от сервера", так как (учитывая задержку ответа сервера, разницу в мощности устройств, скорости загрузки, пинге и т.д.) игра начнется не мгновенно, а через несколько секунд.
 +
 +
==Реванш и всё о нём==
 +
 +
* Реванш между игроками возможен лишь тогда, когда завершилась игра, но игроки еще не покинули текущую игровую сессию;
 +
* Предлагающий реванш игрок должен передать мультиплееру состояние '''want_revanche''';
 +
** Если оппонент покинул сиссию - мультиплеер дёрнет обработчик nst_revanche_refuse ('''реванш невозможен''');
 +
* У принимающей стороны будет вызван обработчик nst_revanche_offered ('''нам предложили реванш''');
 +
* Для подтверждения реванша принимающая сторона должна так же передать мультиплееру состояние '''want_revanche''';
 +
* Когда сервер поймет, что игроки хотят сразиться вновь - у обоих игроков вызовется обработчик nst_revanche_accepted ('''реванш принят''');
 +
* После этого нужно вызвать '''play''' экономике и запустить игру.
 +
 +
==Информация об оппоненте===
 +
При нахождения игры мультиплеером и перед вызовом '''nst_game_created''' в объект мультиплеера записывается информация об оппоненте:
 +
* '''players.opponent0.name''' - имя оппонента
 +
* '''players.opponent0.picture''' - аватарка оппонента
 +
* Так же подтягивается вся инфа из раздела '''public''' опций и находится она в '''players.opponent0.public'''.
 +
 +
=Игра с другом=
 +
 +
==Подготовка необходимостей==
 +
* Самое главное, что вам надо для игры с другом - наличие друга;
 +
* Далее вам нужен логин в социалку и распарсенная таблица друзей;
 +
* Добавить в объект мультиплеера:
 +
** '''Игра с другом''' > '''Таблица друзей''' - указываем таблицу с друзьями;
 +
** '''Игра с другом''' > '''Текст приглашения''' - некое сообщение, которое увидит наш друг (из текстовой базы);
 +
* Добавить в объект клауда:
 +
** (Дефолтное) '''Приглашение в мультиплеер''' > '''multiplayer''' - указываем сюда наш мультиплеер;
 +
** (Дефолтное) '''Приглашение в мультиплеер''' > '''информация''' - создаем новый объект leaderboardsitem и новое окошко для него, которое будет выскакивать при получении приглашения;
 +
** Добавить новый добавляемый обработчик '''Приглашение в мультиплеер''' - он будет вызываться когда игрок получает приглашение;
 +
** Добавить новый добавляемый обработчик '''Подтверждение приглашения в мультиплеер''' - он будет вызываться когда друг принимает наше приглашение;
 +
** В шаблон таблицы парсовых друзей добавить кнопку аля "позвать играть", которая может вызывать любые интерфейсы (например окно выбора пака\комнаты\игры), но рано или поздно должна вызвать объекту multiplayer состояние "invite";
 +
*** '''ВАЖНО:''' для определения кому отсылать приглашение мультиплеер будет смотреть последний тапнутый элемент таблицы из п.1
 +
*** '''ВАЖНО:''' seed на момент вызова invite должен быть заполнен правильно
 +
*** '''ВАЖНО:''' вызвав invite следует быть готовым, что некоторое время спустя пойдет та же реакция, что и на стандартный поиск игры (за исключением того, что таймаут на сервере отдельный и сильно более длинный)
 +
 +
== Порядок действий для игры с другом ==
 +
# Залогиниться в социалку, распарсить таблицу друзей и открыть её;
 +
# Приглашающий игрок должен выбрать друга, нажать на ту самую кнопку "позвать играть";
 +
#* Далее вы должны выбрать во что играть и задать '''seed''' мультиплееру;
 +
#* После всех манипуляций с сидом, вызвать мультиплееру состояние '''invite''' дабы отправить выбранной жертве запрос;
 +
# Принимающему придет нотификейшн (пуш-сообщение) если он не в игре;
 +
#* В самой игре (или по заходу в неё) у клауда сработает обработчик '''cloudnstmpinv''' (Приглашение в мультиплеер), предварительно заполнив информацию о пригласившем в мультиплеере и шаблоне;
 +
# Принимающий должен вызвать состояние '''accept''' мультиплееру (дабы принять запрос) и ждать ответа как на обычный поиск игры;
 +
# У приглашающего сработает обработчик '''cloudnstmpaccept''';
 +
# Приглашающий вызывает '''confirm''' объекту мультиплеер и ждет реакции как на обычный поиск игры;
 +
# Когда сервер сконектит этих игроков - у обоих сработает nst_game_created ('''игра создана''') и начнется обычная игра между друзьями.

Текущая версия на 12:18, 19 июля 2017

Объект необходим для мультиплеерной игры (пока что) между двумя (живыми) людьми.

Параметры объекта Multiplayer

Общие параметры

  • multiplayer appId - айди приложения на сервере мультиплеера
  • timeout - таймаут для поиска игры - сколько времени мультиплеер будет ждать живого игрока
  • long timeout - длинный таймаут, для прерывания игры в нештатной ситуации - сколько игра будет ждать при потере связи, сворачивании приложения и т.п.
  • turnTime - сумарное время на ход игрока (с учетом спецэффектов)
  • seed - номер игрового уровня, пака или еще чего-то, известного конкретной механике

игра с другом

  • таблица друзей - таблица парсовых друзей
  • текст приглашения - id текстовой записи

Добавляемые свойства

+.png получена информация об играх на сервере - обработчик ответа на game_infos

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

Поиск игры

+.png игра создана - на сервере живой игрок найден и инфа о нём загружена (обычно)

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png живой игрок не найден - таймаут на поиск оппонента закончился

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

Обработчики потери\восстановления соединение

+.png сокет потерян - начинаем повторное подключение - приложение потеряло соединение с сервером и пытается его восстановить

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png повторное подключение успех - соединение с сервером восстановлено

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png сокет потерян = повторное подключение невозможно - приложение не смогло восстановить связь и полностью отрубилось от текущей игровой сессии

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png отвалился другой игрок - проблемы с соединением у оппонента

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png вернулся другой игрок - оппонент восстановил связь, игра продолжается

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png другой игрок не вернется - оппонент не смог восстановить соединение

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png другой игрок не сможет начать игру - оппонент отвалился до начала игры

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

Обработчики реванша

+.png нам предложили реванш - мы получили запрос на реванш от оппонента

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png реванш принят - оппонент принял наш запрос на реванш

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png реванш невозможен - по каким-то причинам мы\оппонент не можем начать реванш (например если мы потеряли коннект либо оппонент завершил игровую сессию)

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.

+.png пытаемся восстановить игру -

  • объект слушателя - объект у которого мы меняем состояние.
  • состояние - Значение нового состояния.


Состояния

  • game_infos - запрос у сервера информации по играм (на данный момент кол-во играющих людей: фейковое и настоящее), предварительно указав нужное кол-во записей в параметре param
  • want_game - запускает поиск оппонента, предварительно необходимо в параметр seed указать сид комнаты\игры\механики
  • abandon - закрывает сокет, прерывает текущее соединение. Необходимо вызывать при отмене поиска игры, отмене самой игры (выхода например), фейловой попытке реванша (если, например, не соблюдены какие-то условия) и любых других действиях, при которых мы покидаем текущего оппонента.
  • want_revanche - отправляем запрос на реванш. Если мы уже получили такой запрос от оппонента - вызов этого состояния будет расцениваться как принятие реванша.
  • invite - отправляет приглашение поиграть выбранному другу, предварительно необходимо задать параметр seed, дабы он знал куда мы его тащим.
  • accept - принимает приглашение поиграть
  • confirm - подтвердить свои намерения играть с этим игроком




"Как пользоваться этой штукой?" или базовые настройки для игры с мультиплеером

Сразу оговорюсь, вся описанная тут информация основывается на личном опыте, своеобразном восприятии и плохой памяти. Возможны неточности или излишняя информация. Так же, на момент написания статьи мультиплеер работает только с HiddenList.

Для примера будет использован проект HiddenBattle.

Необходимости для игры с мультиплеером

Внешние настройки

  • Для начала, нужен рабочий настроенный Cloud
  • Так же, нужно завести игру на мультиплеерном сервере (на 1й этаж) и получить 4 праметра: app_multiplayer, key_multiplayer, server_multiplayer, server_websocket;
  • Далее эти параметры необходимо записать в .icf (app/platform) в раздел [Cloud];
  • Ну и, собственно, нужен сам объект Multiplayer.

Внутренние настройки

  • Объект Cloudа;
  • Экономика > Основные параметры > Мультиплеер - указать объект мультиплеера

Настройки хидденлиста под мультиплеер

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

  • Общие параметры:
    • время хода - задать -1;
    • убрать переходы при разборе и "время вышло"
    • задать актер бота и принудительный целевой объект
  • Хидден бот:
    • Тип бота - на одном поле;
    • multiplayer - указать наш объект мультиплеера;
    • кнопка хинта - сделать отдельную кнопку с отдельным хинтом для оппонента
    • при необходимости, нужно заполнить нужные вам счетчики бота (очки, комбо, ...) и указать таймеры хода;
    • длительность хода и длительность паузы между ходами - обязательные поля.
  • Обработчики:
    • разбор: изменить состояние объекта - вызывается мультиплеером при победе игрока;
    • проиграли боту: изменить состояние объекта - вызывается мультиплеером при победе оппонента;
    • Начало хода игрока и Начало хода бота - если нужно как-то отслеживать смену хода

Поиск игры

  • Для начала поиска необходимо определиться, во что именно мы хотим играть (выбрать seed). В моём случае, это номер пака с хидденами и локации в экономике:

Multiplayer 1 seed.png

  • После выбора пака\игры и соблюдения всех условий, записываем seed мультиплееру и вызываем ему состояние want_game. На этом этапе было бы неплохо показать игроку какое-то окно с визуальным отображением ожидания чего-то, но это на вкус и цвет...

Multiplayer 2 waiting.png

  • При нахождении живого оппонента, мультиплеер вызовет обработчик nst_game_created (игра создана) после которого вы можете делать что угодно (анимации, спецэффектики, свистоперделочки и прочее), но после должны запустить хидден (официально, через экономику, состоянием play). Экономика сама синхронизирует между игроками уровень в выбранной локации.
  • В самой хидден-сцене желательно со старта активировать машинку-блокер с текстом тима "Ожидание ответа от сервера", так как (учитывая задержку ответа сервера, разницу в мощности устройств, скорости загрузки, пинге и т.д.) игра начнется не мгновенно, а через несколько секунд.

Реванш и всё о нём

  • Реванш между игроками возможен лишь тогда, когда завершилась игра, но игроки еще не покинули текущую игровую сессию;
  • Предлагающий реванш игрок должен передать мультиплееру состояние want_revanche;
    • Если оппонент покинул сиссию - мультиплеер дёрнет обработчик nst_revanche_refuse (реванш невозможен);
  • У принимающей стороны будет вызван обработчик nst_revanche_offered (нам предложили реванш);
  • Для подтверждения реванша принимающая сторона должна так же передать мультиплееру состояние want_revanche;
  • Когда сервер поймет, что игроки хотят сразиться вновь - у обоих игроков вызовется обработчик nst_revanche_accepted (реванш принят);
  • После этого нужно вызвать play экономике и запустить игру.

Информация об оппоненте=

При нахождения игры мультиплеером и перед вызовом nst_game_created в объект мультиплеера записывается информация об оппоненте:

  • players.opponent0.name - имя оппонента
  • players.opponent0.picture - аватарка оппонента
  • Так же подтягивается вся инфа из раздела public опций и находится она в players.opponent0.public.

Игра с другом

Подготовка необходимостей

  • Самое главное, что вам надо для игры с другом - наличие друга;
  • Далее вам нужен логин в социалку и распарсенная таблица друзей;
  • Добавить в объект мультиплеера:
    • Игра с другом > Таблица друзей - указываем таблицу с друзьями;
    • Игра с другом > Текст приглашения - некое сообщение, которое увидит наш друг (из текстовой базы);
  • Добавить в объект клауда:
    • (Дефолтное) Приглашение в мультиплеер > multiplayer - указываем сюда наш мультиплеер;
    • (Дефолтное) Приглашение в мультиплеер > информация - создаем новый объект leaderboardsitem и новое окошко для него, которое будет выскакивать при получении приглашения;
    • Добавить новый добавляемый обработчик Приглашение в мультиплеер - он будет вызываться когда игрок получает приглашение;
    • Добавить новый добавляемый обработчик Подтверждение приглашения в мультиплеер - он будет вызываться когда друг принимает наше приглашение;
    • В шаблон таблицы парсовых друзей добавить кнопку аля "позвать играть", которая может вызывать любые интерфейсы (например окно выбора пака\комнаты\игры), но рано или поздно должна вызвать объекту multiplayer состояние "invite";
      • ВАЖНО: для определения кому отсылать приглашение мультиплеер будет смотреть последний тапнутый элемент таблицы из п.1
      • ВАЖНО: seed на момент вызова invite должен быть заполнен правильно
      • ВАЖНО: вызвав invite следует быть готовым, что некоторое время спустя пойдет та же реакция, что и на стандартный поиск игры (за исключением того, что таймаут на сервере отдельный и сильно более длинный)

Порядок действий для игры с другом

  1. Залогиниться в социалку, распарсить таблицу друзей и открыть её;
  2. Приглашающий игрок должен выбрать друга, нажать на ту самую кнопку "позвать играть";
    • Далее вы должны выбрать во что играть и задать seed мультиплееру;
    • После всех манипуляций с сидом, вызвать мультиплееру состояние invite дабы отправить выбранной жертве запрос;
  3. Принимающему придет нотификейшн (пуш-сообщение) если он не в игре;
    • В самой игре (или по заходу в неё) у клауда сработает обработчик cloudnstmpinv (Приглашение в мультиплеер), предварительно заполнив информацию о пригласившем в мультиплеере и шаблоне;
  4. Принимающий должен вызвать состояние accept мультиплееру (дабы принять запрос) и ждать ответа как на обычный поиск игры;
  5. У приглашающего сработает обработчик cloudnstmpaccept;
  6. Приглашающий вызывает confirm объекту мультиплеер и ждет реакции как на обычный поиск игры;
  7. Когда сервер сконектит этих игроков - у обоих сработает nst_game_created (игра создана) и начнется обычная игра между друзьями.