Перейти к основному содержимому

Возможности каналов

Обзор

На основе каналов можно реализовать различные варианты общения и взаимодействия игроков: чаты и гильдии, списки друзей и ленты активностей, группы, лобби и комнаты. Каналы могут быть настроены достаточно гибко, с их помощью возможно создать пошаговые сражения и даже организовать передачу подарков игрокам.

tip

Возможности применения каналов огромны и зависят только от ваших идей и фантазии

Для начала работы с каналами перейдите в панель управления, выберите добавленную игру. В меню слева выберите Каналы - Добавить канал, подробнее см. в разделе Управление каналами.

Игроки могут самостоятельно создавать каналы. Для этого в панели управления необходимо создать шаблон канала: Каналы - Добавить Шаблон, подробнее см. в разделе Шаблоны:

Рассмотрим концепцию использования каналов на примере:

  • 🌳 создания чата локации
  • 📢 реализации смены канала
  • ⚔️ создания пошаговых сражений

Чат локации

Например, разработчик создал чат с названием Драконий Пик с идентификатором чата ID: 10. При заходе в игру каждый игрок подключается к серверу и ждет уведомлений от других игроков или администратора.

tip

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]

Желаем вам успехов!