События
Вы можете получать события, связанные с игровой логикой.
Доступ к событиям осуществляется через переменную 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 игрока, который отключился.
Это событие вызывается каждый раз, когда один из игроков на сервере выходит из режима (за афк, или отключился).
Когда игрок отключился, его объекта уже не существует в контексте программы, как и референса на этот объект. Поэтому мы знаем лишь ID отключившегося игрока.
Events.on('playerDisconnected', (pID) => {
console.log("Player disconnected:", pID);
});
buttonClicked(pID, pRef, buttonName, inputs, sliders)
Возвращает:
pID
(int) - ID игрокаpRef
(object) - референс на объект игрока.buttonName
(string) - название нажатой кнопки.inputs
(array) (default:[]
) - массив из значений, на которые ссылаются :input(name) в названии кнопки.sliders
(array) (default:[]
) - массив из значений, на которые ссылаются :slider(name) в названии кнопки.
Событие вызывается каждый раз, когда какой-либо из игроков нажимает на кнопку в интерфейсе.
Исключением являются кнопки с тегом :Silent
в их названии.
Events.on('buttonClicked', (pID, pRef, buttonName, inputs, sliders) => {
});
buttonClickedJson(pID, pRef, json, inputs, sliders)
Возвращает:
pID
(int) - ID игрокаpRef
(object) - референс на объект игрока.json
(object) - название нажатой кнопки.inputs
(array) (default:[]
) - массив из значений, на которые ссылаются :input(name) в названии кнопки.sliders
(array) (default:[]
) - массив из значений, на которые ссылаются :slider(name) в названии кнопки.
Событие вызывается каждый раз, когда какой-либо из игроков нажимает на кнопку в интерфейсе.
Исключением являются кнопки с тегом :Silent
в их названии.
Отличием от события 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!");
}
});