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

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

Когда в игре достаточно игроков, статус игры устанавливается на «НАЧАЛО», и оттуда я хочу запустить 10-секундный таймер и показать его всем клиентам.

Моя идея состоит в том, чтобы использовать хуки коллекции и вызывать setTimeout после обновления коллекции. Но я действительно не знаю, как это сделать, и если это лучшее решение.

Также, может быть, я должен использовать cron вместо таймеров?


person El Poisen    schedule 08.01.2018    source источник


Ответы (1)


Я бы использовал следующую логику:

  • Перехватчик before.update для вашей коллекции, чтобы обновить статус до Started, используя коллекцию крючки
  • установите дату и время в хуке на дату, когда игроков было достаточно => сохраните эти данные в своей коллекции игр

    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);
    

    Я также рекомендую использовать momentjs для управления датами и временем.

person Victor    schedule 08.01.2018
comment
Добрый день, Виктор! Большое спасибо за ответ! Итак, если я правильно понимаю, я должен отображать таймер, используя определенную дату, которую я могу сохранить в коллекции игр? Также я должен написать Meteor.setTimeout в хуке перед обновлением? У меня есть ошибка, говорящая о том, что невозможно использовать таймер в симуляциях. - person El Poisen; 08.01.2018
comment
@ElPoisen, я отредактировал свой ответ, добавив больше примеров кода и деталей. - person Victor; 08.01.2018
comment
Эй, большое спасибо, что нашли время, я ценю! Думаю, теперь я понял. - person El Poisen; 08.01.2018