流畅的多人游戏移动

5

我正在开发一款多人角色扮演游戏(不,它不是一个大型多人在线角色扮演游戏;)。

我的当前设置如下。

客户端告诉服务器“我想向前移动”/“我想向后移动”,然后服务器更新您的实体,并通知该区域内的所有客户端进行更改。服务器还会每20毫秒更新每个实体,并在每100毫秒发送更新到客户端,这些更新包含位置、速度、旋转等。

到目前为止都很好,但是我在客户端方面没有存储平滑移动的内容,我必须说,我无法让它正常工作。我一直在阅读预测、插值、死区计算等相关内容,但对我来说这些都是一团糟。

所以现在我只是做类似于“Position = Packet.Position”的事情,导致非常卡顿的运动。

因此,我需要帮助解决的问题是,如何获得更流畅的运动?我已经看过XNA预测示例,但我无法正确使用它。

谢谢 //F


你需要让玩家的移动更加流畅,还是其他物体也需要?客户端是否知道玩家当前的速度? - ssmir
目前我只有玩家,所以这是我的主要关注点。客户端知道速度,它包含在服务器的状态包中。实际上,我在IRC上得到了一个不错的答案,明天会尝试一下,如果成功了我会分享的。 - Fredrik Widerberg
3个回答

12

3
我建议从另一个问题(见采纳的答案)中得到的想法。
在这里,客户端会自己计算其位置,就像它不是网络游戏一样。客户端定期将其当前位置发送到服务器。如果客户端作弊或无法朝所选方向继续移动,则服务器只需发送客户端正确的位置。
同样的算法在Ultima Online中使用(至少在10年前我玩时是这样的)。

有趣的是你提到了《终极在线》,这是我最喜欢的游戏之一。:) 如果我发现当前实现存在问题,我会尝试这个方法。但是,这难道不会导致玩家A和玩家B看到的有很大的差异吗? - Fredrik Widerberg
@Fredrik,这也是我最喜欢的之一 =)实际上,差异将取决于玩家的ping,并且可以估计。但我认为差异在这里没有任何作用,因为例如在UO中攻击某人时,客户端会发送被攻击对象的ID。因此,位置上的一些差异只有在您将两个监视器放在一起并进行比较时才能注意到。当您通过互联网而不是局域网运行游戏时,问题应该开始出现。特别是如果您使用TCP,因为任何数据包丢失都会导致秒级(至少)的巨大延迟。 - ssmir

0

我通过在我的主实体旁边运行一个幽灵实体来解决这个问题。
幽灵实体也会在每一帧更新,但是每当有数据包进来时,它的值就会被设置为数据包的值。

然后我逐渐调整真实实体到与幽灵实体相同的位置。


那么,玩家发起移动的时刻和幽灵接收到新位置的时刻之间仍然存在延迟吗? - ssmir
是的,然而这并不明显。 - Fredrik Widerberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接