如何使用WebSocket来实现实时游戏

15

我想制作一个使用WebSockets和Node.js服务器的2人乒乓球游戏。Socket.io在客户端和服务器上都被使用。到目前为止,我唯一的经验是创建聊天应用程序。

这是我的第一次尝试制作多人游戏,因此我对网络游戏不太熟悉。服务器应该跟踪以下内容吗:

  1. 球的每个位置以及何时或何时发生的情况?
  2. 玩家移动、向左或向右移动,如果我按住一段时间怎么办?我该如何处理?我是否应该发送诸如pressHoldStartPositionpressHoldStopPosition之类的指令?如果我只允许按下而不是长按,则应该很容易。

我的想法:

  1. 当球击中一个玩家时,客户端计算速度、起始和结束位置,另一个客户端应该从那里执行正确的动画。
  2. 不确定。

1
你一定要看看@RobHawkes的博客:http://rawkes.com/。他开发并继续构建一个名为Rawkets的HTML5多人游戏http://rawkets.com/。我相信他已经分享了很多与你正在寻找的相关主题和其他你可能遇到的事情有关的信息。 - leggetter
3个回答

16
  1. 客户端不会计算任何东西,除非你想让它预测下一个游戏步骤*(服务器回答)。整个游戏在服务器上运行,服务器是唯一可信的数据和计算来源。在像乒乓球这样的游戏中,如果物体少于10个,您可以经常发送数据(50毫秒间隔即可)。对于球,我会发送[x、y、速度或角度],对于挡板,我会发送[x、y]。然后在旧的(客户端上的x,y)和新的(从服务器刚刚收到的x,y)之间插值(以时间为动画-50毫秒)。

  2. 不要发送无数个“玩家按了向上键”的副本,而是每隔一段时间(100毫秒?)发送一个包含信息的数据包,例如“玩家正在按向上键”100毫秒,或者“玩家将位置设置为”(32,100),然后在服务器端检查此移动是否可行并接受或拒绝。

也许这个线程可以帮助您的冒险:

使用Node.JS构建的多人JavaScript游戏-分离玩家

[*1]预测是一种延迟补偿机制,您可以稍后实现。以简化的方式来说,它意味着服务器和客户端共享一些游戏逻辑代码,并且当客户端没有来自服务器的当前数据时,它会尝试模拟真实游戏中正在发生的情况。


4
你会发现有关游戏网络的书籍层出不穷。
简要描述一下,我发现一个有趣的实现方式是:服务器和客户端计算游戏物理。服务器将成为主控方,并拥有所有实体的正确状态,而客户端将尝试“预测”实体的状态并保持平稳的动画。客户端将定期从服务器获取实体的正确状态。在某些游戏中,您可能会看到实体突然传送,这是因为客户端预测的位置与服务器实际位置不匹配。
实体状态(例如球或玩家)通常包含诸如位置、速度、按钮状态(按下/松开)等信息。
除此之外,最好的解决方案还要考虑许多因素,例如玩家延迟和带宽。当你不断地进行想象和测试时,才能找到最优解。

2

有一个专门针对游戏开发的StackExchange网站:https://gamedev.stackexchange.com/

最佳实践是只发送客户端需要知道的更新。通常情况下,您会发送用户操作的结果而不是操作本身。可以计算的内容(物理)不需要发送,除非定期进行同步点以纠正随着时间累积误差和与远程用户操作同步。这也使游戏看起来更加交互,并覆盖了由网络延迟和抖动导致的某些卡顿。

这种模型的主要缺点是:如果您的网络延迟高或数据包丢失,当物理计算继续并突然收到远程用户的更新时,您将出现时间线分歧的效果,其中我们尚未捕获到他们影响物理学的某些行为。但这是大多数网络游戏中的标准问题,其他替代方案对于大多数实时游戏类型都更糟糕。


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