我正在使用JavaScript中的Socket IO创建一个多人游戏。目前这个游戏除了客户端插值外运作得非常完美。目前,当我从服务器接收到一个数据包时,我只是简单地将客户端位置设置为服务器发送的位置。以下是我尝试过的方法:
getServerInfo(packet) {
var otherPlayer = players[packet.id]; // GET PLAYER
otherPlayer.setTarget(packet.x, packet.y); // SET TARGET TO MOVE TO
...
}
我设置了玩家的目标位置。然后在玩家的更新方法中,我只是这样做:
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关于这个主题的文章,他提到了这个:
假设您在t = 1000收到位置数据。您已经在t = 900时收到了数据,因此您知道玩家在t = 900和t = 1000时的位置。因此,从t = 1000和t = 1100开始,您显示另一个玩家从t = 900到t = 1000所做的操作。这样,您始终显示用户实际移动数据,只是您会“晚”100毫秒显示它。
这再次假定它恰好是晚100ms。如果您的ping变化很大,则无法正常工作。
您能否提供一些伪代码,以便我了解如何执行此操作?
我在这里找到了这个问题。但是没有一个答案提供如何执行此操作的示例,只有建议。