Возможности каналов
Обзор
На основе каналов можно реализовать различные варианты общения и взаимодействия игроков: чаты и гильдии, списки друзей и ленты активностей, группы, лобби и комнаты. Каналы могут быть настроены достаточно гибко, с их помощью возможно создать пошаговые сражения и даже организовать передачу подарков игрокам.
Возможности применения каналов огромны и зависят только от ваших идей и фантазии
Для начала работы с каналами перейдите в панель управления, выберите добавленную игру. В меню слева выберите Каналы - Добавить канал, подробнее см. в разделе Управление каналами.
Игроки могут самостоятельно создавать каналы. Для этого в панели управления необходимо создать шаблон канала: Каналы - Добавить Шаблон, подробнее см. в разделе Шаблоны:
Рассмотрим концепцию использования каналов на примере:
- 🌳 создания чата локации
- 📢 реализации смены канала
- ⚔️ создания пошаговых сражений
Чат локации
Например, разработчик создал чат с названием Драконий Пик
с идентификатором чата ID: 10
. При заходе в игру каждый игрок подключается к серверу и ждет уведомлений от других игроков или администратора.
SDK делает это автоматически
Если игрок хочет перейти в локацию Драконий Пик
, то это можно реализовать через вступление в канал:
gp.channels.join({ channelId: 10 });
После того как игрок вступил в канал, он может получать уведомления в этом канале. Присутствие в канале можно использовать как гарантию присутствия игрока на локации в игре. Игрок может поприветствовать других участников чата, отправив сообщение:
gp.channels.sendMessage({
channelId: 10,
text: 'Ребята, всем привет! Тут сильно сложно?',
});
Чтобы остальные игроки могли получить сообщение, на него нужно подписаться. Когда сообщение поступит, оно может быть отрисовано:
// подписка на сообщение
gp.channels.on('event:message', (message) => {
// здесь вы отрисовываете сообщение в чате, пример
mygame.displayMessage(message.player.name, message.text);
});
Далее рассмотрим смену канала на примере всё той же локации.
Смена канала
Повысив уровень, игрок готов перейти в следующую локацию Палата Королей
с идентификатором ID: 11
. Для этого нужно выйти из предыдущего канала Драконий Пик
и вступить в канал Палата Королей
:
// выйти из канала Драконий Пик
gp.channels.leave({ channelId: 10 });
// вступить в канал Палата Королей
gp.channels.join({ channelId: 11 });
Пошаговые сражения
Полноценный мультиплеер через каналы сделать не получится, однако можно реализовать пошаговый режим. Идея достаточно проста и заключается в том, чтобы отправлять сообщения в виде лога боя:
> "Игрок 1234" применяет заклинание "Праведный свет" на существо "Зомби 2"
> "Зомби 2" получает 132 урона
> "Зомби 2" атакует "Игрок 1234"
> "Игрок 1234" получает 11 урона
Записи лога боя в таком формате понятны визуально, но с ними может быть тяжело работать в игре. Представим сообщения в виде JSON объектов:
gp.channels.sendMessage({
channelId: 123,
text: JSON.stringify({
type: 'ATTACK',
spell: 'RIGHTEOUS_LIGHT',
target: 'ZOMBIE_2',
}),
});
Результат:
> {"type":"ATTACK","spell":"RIGHTEOUS_LIGHT","target":"ZOMBIE_2"}
Чтобы реагировать на получение урона, один из игроков должен взять на себя роль хоста. Обычно эту роль выполняет игрок - владелец канала, именно он будет разыгрывать урон и реакцию монстров.
Для этого подпишемся на сообщения и, если игрок является владельцем канала, то разыграем механику боя:
// подписка на сообщение
gp.channels.on('event:message', (message) => {
// канал боя
if (message.channelId === battleChannel.id) {
// Парсим JSON сообщения
const result = JSON.parse(message.text);
// тип сообщения - атака и владелец канала наш игрок
if (result.type === 'ATTACK' && channel.ownerId === gp.player.id) {
handleAttackMessage(result);
}
// тип сообщения - результат атаки, уведомление для всех, в том числе и владельцу канала
if (result.type === 'ATTACK_RESULT') {
handleAttackResultMessage(result);
}
}
});
// ловим сообщение атаки
function handleAttackMessage(result) {
// получаем тип заклинания
const spell = getSpell(result.spell);
// получаем цель заклинания
const target = getTarget(result.target);
// рассчитываем урон
const damage = spell.damage - target.armor;
// оповещаем всех, что цели был нанесен урон
gp.channels.sendMessage({
channelId: battleChannel.id,
text: JSON.stringify({
type: 'ATTACK_RESULT',
target: 'ZOMBIE_2',
damage: damage,
}),
});
}
// ловим сообщение результата атаки
function handleAttackResultMessage(result) {
// получаем цель заклинания
const target = getTarget(result.target);
// изменяем значение HP цели на урон
target.hp -= result.damage;
}
Оставайтесь на связи
С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.
Сообщество GamePush в Telegram
: @gs_community.
Для ваших обращений e-mail
: [email protected]
Желаем вам успехов!