【发布时间】:2015-12-16 21:42:09
【问题描述】:
我正在使用 javascript 中的套接字 io 创建多人游戏。除了客户端插值外,该游戏目前完美运行。现在,当我从服务器收到一个数据包时,我只需将客户端位置设置为服务器发送的位置。这是我尝试做的:
getServerInfo(packet) {
var otherPlayer = players[packet.id]; // GET PLAYER
otherPlayer.setTarget(packet.x, packet.y); // SET TARGET TO MOVE TO
...
}
所以我设置了玩家的目标位置。然后在 Players Update 方法中我只是这样做了:
var update = function(delta) {
if (x != target.x || y != target.y){
var direction = Math.atan2((target.y - y), (target.x - x));
x += (delta* speed) * Math.cos(direction);
y += (delta* speed) * Math.sin(direction);
var dist = Math.sqrt((x - target.x) * (x - target.x) + (y - target.y)
* (y - target.y));
if (dist < treshhold){
x = target.x;
y = target.y;
}
}
}
这基本上是让玩家以固定的速度向目标方向移动。问题是玩家在下一个信息从服务器到达之前或之后到达目标。
编辑:我刚刚阅读了 Gabriel Bambettas Article 关于这个主题,他提到了这一点:
假设您在 t = 1000 收到位置数据。您已经在 t = 900 收到数据,因此您知道玩家在 t = 900 和 t = 1000 时的位置。所以,从 t = 1000 和 t = 1100,你展示了其他玩家从 t = 900 到 t = 1000 所做的事情。这样你总是向用户展示实际的移动数据,除非你“延迟”了 100 毫秒。
这再次假设它晚了 100 毫秒。如果您的 ping 变化很大,这将不起作用。
您能否提供一些伪代码,以便我了解如何执行此操作?
我在网上找到了这个问题here。但是没有一个答案提供了如何做到这一点的例子,只有建议。
【问题讨论】:
-
我也遇到了这个问题,我的游戏有抖动。您是否能够使用带有复选标记的答案来解决此问题?还是有其他因素可以帮助您解决这个问题?如果是这样,您能否提供某种示例实现?谢谢。
标签: javascript algorithm multiplayer