我想制作一个使用websockets和node.js服务器的双人乒乓球游戏。socket.io同时用于客户端和服务器。到目前为止,我唯一的经验就是创建一个聊天应用程序。
这是我第一次尝试多人游戏,所以我对网络游戏不太熟悉。服务器是否应跟踪:
- 球的每一个位置,多久或什么时候
- 玩家移动,玩家向左或向右移动,如果我按住一段时间怎么办,我该如何处理?我应该像发送
pressHoldStartPosition
和pressHoldStopPosition
一样发送吗?如果我只允许按压而不允许按住,我想这很容易
我的想法:
- 当球击中球员时,客户端计算速度、开始和结束位置,另一个客户端应该据此执行正确的动画
- 不知道
-
客户端不进行任何计算,除非您希望它预测下一个游戏步骤*(服务器anwser)。整个游戏运行在服务器上,这是唯一值得信赖的数据和计算来源。在少于10个物体的乒乓球游戏中,你可以经常发送数据(间隔50毫秒即可)。对于一个球,我会发送[x,y,速度或角度],对于一个球拍[x,y]。然后在旧的(客户端上的x,y)和新的(刚从服务器上得到的x,y)之间插值(动画时间为50ms)。
-
不要发送数百万份-玩家按下-而是在每段时间(100ms?)发送一个数据包,其中包含"玩家正在按下"100ms或"玩家设置位置"到(32100)的信息,然后检查服务器端是否可以进行此操作,并接受或拒绝。
也许这个线程将有助于你的冒险:
使用Node.JS构建的多人JavaScript游戏-分离玩家
[*1]预失真是一种滞后补偿机制,您可以稍后实现。简单地说,这意味着服务器和客户端共享一些游戏逻辑代码,当客户端没有来自服务器的当前数据时,它会尝试模拟真实游戏中发生的事情。
你会发现关于游戏网络的书籍。
在简短的描述中,以下是我发现的一个有趣的实现:服务器和客户端计算游戏的物理特性。服务器将是一个主服务器,并拥有所有实体的正确状态,而客户端将尝试"预测"实体的状态并保持平滑的动画。客户端将定期从服务器获得实体的正确状态更新。在一些游戏中,你可能会看到实体突然传送,这是因为客户端预测的位置与服务器的实际位置不匹配。
实体状态,如球或球员,通常包含位置、速度、按钮状态(向下键/向上键)等信息。
除此之外,它还让你的想象力天马行空,测试最佳解决方案,看看什么有效。需要考虑的因素很多,比如播放器延迟和带宽。
有一个stackexchange网站专门用于游戏开发:https://gamedev.stackexchange.com/
最佳做法是只发送客户端需要了解的更新。此外,通常发送用户操作的结果,而不是操作本身。可以计算的东西(物理)不需要发送,除了周期性的同步点,以说明随着时间的推移积累错误的浮点错误,并与远程用户操作同步。这也使游戏看起来更具互动性,并涵盖了网络延迟和抖动造成的一些口吃。
该模型的主要缺点是,如果你有高网络延迟或数据包丢失,当物理计算继续时,你会得到发散的时间线效应,突然你从远程用户那里得到更新,表明他们做了一些我们还没有发现的事情来影响物理。但这是大多数网络游戏中的标准问题,而对于大多数类型的实时游戏来说,替代方案更糟糕。