Таймер на стороне сервера после обновления коллекции метеоров

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

Когда в игре достаточно игроков, статус игры устанавливается на "НАЧАЛО", и оттуда я хочу запустить 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);
    

    Я также рекомендую использовать моменты, чтобы фактически манипулировать датами и временем

Другие вопросы по тегам