Multiplayer — различия между версиями
Bmor (обсуждение | вклад) (→Игра с другом) |
Bmor (обсуждение | вклад) (→"Как пользоваться этой штукой?" или базовые настройки для игры с мультиплеером) |
||
Строка 145: | Строка 145: | ||
* Когда сервер поймет, что игроки хотят сразиться вновь - у обоих игроков вызовется обработчик nst_revanche_accepted ('''реванш принят'''); | * Когда сервер поймет, что игроки хотят сразиться вновь - у обоих игроков вызовется обработчик nst_revanche_accepted ('''реванш принят'''); | ||
* После этого нужно вызвать '''play''' экономике и запустить игру. | * После этого нужно вызвать '''play''' экономике и запустить игру. | ||
+ | |||
+ | ==Информация об оппоненте=== | ||
+ | При нахождения игры мультиплеером и перед вызовом '''nst_game_created''' в объект мультиплеера записывается информация об оппоненте: | ||
+ | * '''players.opponent0.name''' - имя оппонента | ||
+ | * '''players.opponent0.picture''' - аватарка оппонента | ||
+ | * Так же подтягивается вся инфа из раздела '''public''' опций и находится она в '''players.opponent0.public'''. | ||
=Игра с другом= | =Игра с другом= |
Текущая версия на 12:18, 19 июля 2017
Объект необходим для мультиплеерной игры (пока что) между двумя (живыми) людьми.
Содержание
Параметры объекта Multiplayer
Общие параметры
- multiplayer appId - айди приложения на сервере мультиплеера
- timeout - таймаут для поиска игры - сколько времени мультиплеер будет ждать живого игрока
- long timeout - длинный таймаут, для прерывания игры в нештатной ситуации - сколько игра будет ждать при потере связи, сворачивании приложения и т.п.
- turnTime - сумарное время на ход игрока (с учетом спецэффектов)
- seed - номер игрового уровня, пака или еще чего-то, известного конкретной механике
игра с другом
- таблица друзей - таблица парсовых друзей
- текст приглашения - id текстовой записи
Добавляемые свойства
получена информация об играх на сервере - обработчик ответа на game_infos
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
Поиск игры
игра создана - на сервере живой игрок найден и инфа о нём загружена (обычно)
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
живой игрок не найден - таймаут на поиск оппонента закончился
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
Обработчики потери\восстановления соединение
сокет потерян - начинаем повторное подключение - приложение потеряло соединение с сервером и пытается его восстановить
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
повторное подключение успех - соединение с сервером восстановлено
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
сокет потерян = повторное подключение невозможно - приложение не смогло восстановить связь и полностью отрубилось от текущей игровой сессии
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
отвалился другой игрок - проблемы с соединением у оппонента
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
вернулся другой игрок - оппонент восстановил связь, игра продолжается
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
другой игрок не вернется - оппонент не смог восстановить соединение
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
другой игрок не сможет начать игру - оппонент отвалился до начала игры
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
Обработчики реванша
нам предложили реванш - мы получили запрос на реванш от оппонента
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
реванш принят - оппонент принял наш запрос на реванш
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
реванш невозможен - по каким-то причинам мы\оппонент не можем начать реванш (например если мы потеряли коннект либо оппонент завершил игровую сессию)
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
- объект слушателя - объект у которого мы меняем состояние.
- состояние - Значение нового состояния.
Состояния
- 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). В моём случае, это номер пака с хидденами и локации в экономике:
- После выбора пака\игры и соблюдения всех условий, записываем seed мультиплееру и вызываем ему состояние want_game. На этом этапе было бы неплохо показать игроку какое-то окно с визуальным отображением ожидания чего-то, но это на вкус и цвет...
- При нахождении живого оппонента, мультиплеер вызовет обработчик 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 (игра создана) и начнется обычная игра между друзьями.