服务器和客户端都有代码
setInterval(function(){
player.x++;
player.y++;
}, 20);
我有一个node.js / socket.io服务器,其中每个帧都会更新播放器的x和y并发送给客户端。客户端也使用相同的逻辑更新不同的x和y。客户似乎比服务器移动速度更快,因此它使游戏不同步。我应该做什么不同的做法?
答案 0 :(得分:0)
这是一个庞大而复杂的话题,我没有心情为你辩论这些主题;但有一些提示/方向。
这不是一个完整的答案,但更多的解释,一个评论可以采取。
第一:不要在后面和后面增加值。
将它们定义为动画:{ startTime, startValue, endTime, endValue }
。现在,您可以随时插入当前位置,与间隔无关。
第二:你必须考虑前端和后端之间的时间偏移。
第3步:检查前端是否操作了计时器:这是一种常见的作弊行为。不要把时钟的正确性视为理所当然。
第4:你还必须考虑ping,例如,当从前端接收动作时,你应该减去ping以知道动作何时真正发生。并且不要忘记一遍又一遍地检查ping:它可能会随着时间的推移而改变。
而且,你只能相信自己的时钟,你应该检查操作(例如,人为地减慢连接速度)。谷歌ping-cheater
,...
最后:你并不是第一个创造实时游戏的人。搜索这些主题,它们已经解决,并且过去曾被其他人询问过。
特别是在flash社区中搜索。 Flash仍然是一个流行的游戏平台,AS3代码应该很容易理解并移植到JS。
答案 1 :(得分:0)
实际上真的很容易,任何有同样问题的人都读过这篇文章。 https://www.viget.com/articles/time-based-animation
最简单的方法是根据自上次移动以来已经过了多长时间而移动"所以只需通过从time_then中减去time_now来找到deltaTime变量。
这就是我的updatePosition函数现在的样子
self.updatePosition = function(){
var now_time = (new Date).getTime();
var delta_time = now_time - self.then_time;
self.x += delta_time * self.velocityX;
self.y += delta_time * self.velocityY;
self.then_time = now_time;
}
只需在初始化中设置then_time,或者在角色首次开始移动时设置。