gpt4 book ai didi

meteor 多人游戏客户端不同步 - 如何调试?

转载 作者:行者123 更新时间:2023-12-04 20:51:02 25 4
gpt4 key购买 nike

我在 Meteor 中构建了一个简单的实时多人数学游戏,您可以在这里试用:http://mathplay.meteor.com

在本地播放时(使用不同的浏览器),一切正常。但是当我和 friend 在 Internet 上玩游戏时,客户端经常不同步:一个玩家被列为活跃的问题实际上已经被另一个玩家解决了。

我的猜测是,一些应该只在服务器上运行的代码会在其中一个客户端上执行。有关如何调试此行为的任何建议?

当用户提交答案时,客户端会发生以下情况:

Template.number_input.events[okcancel_events('#answertextbox')] = make_okcancel_handler({
ok: function (text, event) {
question = Questions.findOne({ order_number: Session.get("current_question_order_number") });
if (question.answer == document.getElementById('answertextbox').value) {
console.log('True');
Questions.update(question._id, {$set: {text: question.text.substr(0, question.text.length - 1) + question.answer, player: Session.get("player_name")}});
callGetNewQuestion();
}
else {
console.log('False');
}
document.getElementById('answertextbox').value = "";
document.getElementById('answertextbox').focus();
}
});

callGetNewQuestion() 在客户端和服务器上触发这个:
getNewQuestion: function () {
var nr1 = Math.round(Math.random() * 100);
var nr2 = Math.round(Math.random() * 100);
question_string = nr1 + " + " + nr2 + " = ?";
question_answer = (nr1 + nr2);
current_order_number = Questions.find({}).count() + 1;
current_question_id = Questions.insert({ order_number: current_order_number, text: question_string, answer: question_answer });
return Questions.findOne({_id: current_question_id});//current_question_id;
},

完整源代码供引用: https://github.com/tomsoderlund/MathPlay

最佳答案

你的问题在于:

callGetNewQuestion() triggers this on both client and server



这将生成一个不同的 _id由于时间差异,以及一个不同的问题,然后将被服务器生成的那个问题替换。然而,情况可能并非总是如此。这很容易让事情变得不同步,仅仅因为您的客户端正在生成自己的东西。

您需要找到一种更好的方法来确保客户端生成与服务器相同的数据。这可以通过确保随机数生成器以相同的方式播种并因此每次都提供相同的随机数来完成。这将解决任何闪烁,因为值不同。

然后,对于实际的错误,您可能不想这样做:
return Questions.findOne({_id: current_question_id});

但是这样做(仅在客户端上,在服务器上什么都不做):
Session.set('current_order', current_order_number); // ORDER! Not the _id / question_id.

这样,您可以将以下内容放入模板助手中:
return Questions.findOne({ order_number: Session.get('current_order') });

本质上,这将在 Collection 上以 react 方式工作,而不依赖于返回值。

关于 meteor 多人游戏客户端不同步 - 如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com