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

События

Вы можете получать события, связанные с игровой логикой.

Доступ к событиям осуществляется через переменную Events.

Пример инициализации:

const Server = require('./KotikiServer.js');
const {Events, GUI} = Server;

playerConnected(pRef)

Возвращает:

  • pRef (object) - референс на объект игрока.

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

Остальные события, связанные с игроком не вызываются, пока не произойдет событие playerConnected.

Пример, в котором для каждого подключившегося игрока на всякий случай выставляется начальный баланс 0, если у игрока до сих пор нет свойства .balance внутри сохраняемого свойства .objs:

Events.on('playerConnected', (pRef) => {

pRef.objs.balance = pRef.objs.balance || 0;

});

playerDisconnected(pID)

Возвращает:

  • pID (int) - ID игрока, который отключился.

Это событие вызывается каждый раз, когда один из игроков на сервере выходит из режима (за афк, или отключился).

Где pRef?

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

Events.on('playerDisconnected', (pID) => {

console.log("Player disconnected:", pID);

});

buttonClicked(pID, pRef, buttonName, inputs, sliders)

Возвращает:

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

Events.on('buttonClicked', (pID, pRef, buttonName, inputs, sliders) => {

});

buttonClickedJson(pID, pRef, json, inputs, sliders)

Возвращает:

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

json

Отличием от события buttonClicked является то, что событие buttonClickedJson передает не название нажатой кнопки, а заранее установленный в кнопку с помощью addButtonEvent(json) json-объект.

Этот вариант события полезен, если нужно обрабатывать нажатия на кнопки в созданных префабах в списках (например, товары в магазине с кнопкой покупки). Тогда пример json-объекта для каждого следующего товара будет {"buyItem": 1}, {"buyItem": 2} и так далее...

Events.on('buttonClickedJson', (pID, pRef, json, inputs, sliders) => {

if (json.buyItem !== undefined){
// Игрок нажал на кнопку покупки, а в json.buyItem содержится ID товара.
}

});

touch(pID, pRef, x, y)

Возвращает:

  • pID (int) - ID игрока
  • pRef (object) - референс на объект игрока.
  • x (float) - X координата
  • y (float) - Y координата

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

Координаты x и y означают позицию точки на сервере, на которую нажал игрок на своем устройстве.

Игнорируемые зоны

При этом игнорируются нажатия на элементы интерфейса и на нажатия на других игроков.

Конфигурация сервера

В config.js свойство sendTouches должно равняться true, чтобы получать событие touch.

Нужно еще добавить какой-нибудь objCol (object collision) для объектов сцены, чтобы при нажатии на них тоже отправлялось событие что игрок нажал на них

tick(currentTick)

Возвращает:

  • currentTick (int) - текущий номер тика. Полезен для обработки событий лишь раз в N тиков: if (currentTick % N == 0).

Событие вызывается каждый тик сервера.

Тик сервера

В каком-то смысле это то же самое, что и кадр. Каждый тик означает исполнение определенного набора логики, включая обработку этого события. По-умолчанию, KotikiServer имеет тик-рейт 10. Это значит, что за секунду программа получает событие tick 10 раз.

Следите за производительностью

Если код текущего события tick исполняется медленнее, чем за 100мс (выделенное время на 1 тик), значит следующее событие tick будет вызывано позже, что приведет к замедлению работы логики и появлению неприятных лагов для игроков.

Учитывайте, что помимо написанной Вами логики, есть еще и внутренняя логика KotikiServer, такая как:

  • Обновление публичных данных об игроках и объектах, которые надо будет потом отправить клиентам.
  • Отправка клиентам данных о том, какие объекты находятся рядом с ними, и что в них изменилось.
  • Некоторые дополнительные операции (например, сохранение прогресса для вышедших игроков и удаление их референса из API.players).
Events.on('tick', (currentTick) => {

// Примерно раз в 0.5 секунд выводим в консоль "Hello, World!"

if (currentTick % 5 == 0)
console.log("Hello, World!");
}

});