我目前正在开发一款简单的实时多人游戏,而且我一直坚持使用计时器逻辑。
当游戏中有足够的玩家时,游戏的状态将设置为“已启动”,并且从那里我想启动一个10秒计时器并将其显示给所有客户。
我的想法是使用集合挂钩并在集合更新后调用setTimeout。但我真的不知道怎么做,如果这是最好的解决方案。
也许我应该使用cron而不是计时器?
答案 0 :(得分:3)
我会使用以下逻辑:
在玩家足够的日期在钩子中设置日期时间=>将此数据保存在您的游戏集中
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来实际操作日期和时间