1

我目前正在开发一个简单的实时多人游戏,但我被计时器逻辑困住了。

当游戏中有足够多的玩家时,游戏的状态设置为“已开始”,我想从那里启动一个 10 秒计时器并将其显示给所有客户端。

我的想法是在集合更新后使用集合挂钩并调用 setTimeout。但我真的不知道该怎么做,以及它是否是最好的解决方案。

另外也许我应该使用 cron 而不是计时器?

4

1 回答 1

3

我会使用以下逻辑:

  • before.update 钩子在你的集合上更新状态为Started using collection hooks
  • 在钩子中为玩家足够的日期设置一个日期时间 => 将此数据保存在您的游戏收藏中

    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来实际操作日期和时间

于 2018-01-08T10:11:03.873 回答