Таймер на стороне сервера после обновления коллекции метеоров
В настоящее время я разрабатываю простую многопользовательскую игру в реальном времени и застрял в логике таймера.
Когда в игре достаточно игроков, статус игры устанавливается на "НАЧАЛО", и оттуда я хочу запустить 10-секундный таймер и показать его всем клиентам.
Моя идея состоит в том, чтобы использовать хуки коллекции и вызывать setTimeout после обновления коллекции. Но я не знаю, как это сделать, и если это лучшее решение.
Также, возможно, я должен использовать cron вместо таймеров?
1 ответ
Я бы использовал следующую логику:
- ловушка before.update в вашей коллекции, чтобы обновить статус на Запущено с помощью ловушек коллекции
установить дату в ловушку для даты, когда игроков было достаточно => сохранить эти данные в вашей игровой коллекции
Game.before.update(function (userId, doc, fieldNames, modifier, options) { if (modifier && modifier.$set && modifier.$set.nb_of_players > 10) { modifier.$set.status = "Started"; modifier.$set.startingTime = new Date(); } });
используйте помощника для динамического вычисления времени, которое будет отображаться на вашем клиенте, вот базовый рабочий пример отображения времени реакции, которое вам нужно улучшить, чтобы получить обратный отсчет:
Template.Home.helpers({ time: function () { return Template.instance().date.get(); }, }); Template.Home.onCreated(function () { var self = Template.instance(); self.date = new ReactiveVar(); Meteor.setInterval(function () { self.date.set(new Date()); }, 1); });
используйте setTimeout, чтобы сделать что-то спустя 10 секунд - это следует вызывать после запуска игры. Либо в автозапуске проверки значения, либо в функции обратного вызова Meteor.call, которую вы используете:
Meteor.setTimeout(function(){ Meteor.call("launchAction", {data:data}, function (error, result) { if (error){ console.error(error); } else { } }); }, 10);
Я также рекомендую использовать моменты, чтобы фактически манипулировать датами и временем