更新流星收集后的服务器端计时器
Server side timer after meteor collection is updated
我目前正在开发一个简单的实时多人游戏,但我受困于计时器逻辑。
当游戏中有足够的玩家时,游戏的状态设置为 "STARTED" 并且我想从那里开始一个 10 秒的计时器并将其显示给所有客户端。
我的想法是使用集合挂钩并在集合更新后调用 setTimeout。但我真的不知道该怎么做,也不知道它是否是最好的解决方案。
也许我应该使用 cron 而不是计时器?
我会使用以下逻辑:
- before.update 使用 collection hooks
挂钩 collection 将状态更新为 Started
在挂钩中设置一个日期时间作为玩家足够的日期 => 将此数据保存在您的游戏中 Collection
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 实际操作日期和时间
我目前正在开发一个简单的实时多人游戏,但我受困于计时器逻辑。
当游戏中有足够的玩家时,游戏的状态设置为 "STARTED" 并且我想从那里开始一个 10 秒的计时器并将其显示给所有客户端。
我的想法是使用集合挂钩并在集合更新后调用 setTimeout。但我真的不知道该怎么做,也不知道它是否是最好的解决方案。
也许我应该使用 cron 而不是计时器?
我会使用以下逻辑:
- before.update 使用 collection hooks 挂钩 collection 将状态更新为 Started
在挂钩中设置一个日期时间作为玩家足够的日期 => 将此数据保存在您的游戏中 Collection
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 实际操作日期和时间