我想制作一个使用websockets和node.js服务器的2人乒乓球游戏。客户端和服务器上都使用socket.io。到目前为止,我唯一的经验是创建一个聊天应用程序。
这是我第一次尝试多人游戏,所以我对网络游戏并不熟悉。服务器应该跟踪:
pressHoldStartPosition
和pressHoldStopPosition
一样发送吗?我想这很容易,如果我只允许按下而不是按住。我的想法:
答案 0 :(得分:13)
客户计算 - 没有 - 除非您希望它预测下一个游戏步骤*(服务器anwser)。整个游戏在服务器上运行,服务器是唯一可信赖的数据和计算源。在类似于少于10个对象的游戏中,您可以经常发送数据(间隔为50毫秒)。对于一个球我会发送[x,y,速度或角度],用于桨[x,y]。 然后在旧的(客户端上的x,y)和新的(你刚从服务器上获得的x,y)之间进行插值(动画时间 - 50ms)。
不要发送 - 玩家按下的数百万个副本 - 而是每隔一段时间(100毫秒?)发送一个数据包,其中包含“玩家正在按下”等信息100毫秒,或“玩家设置位置”为( 32,100)然后检查服务器端是否可以接受或拒绝。
也许这个帖子会对你的冒险有所帮助:
Multiplayer JavaScript game built with Node.JS - Separating players
[* 1]预测是一种滞后补偿机制,您可以在以后实施。简化的方式意味着服务器和客户端共享一些游戏逻辑代码,当客户端没有来自服务器的当前数据时,它会尝试模拟真实游戏中发生的事情。
答案 1 :(得分:2)
你将会在书籍上找到有关游戏网络的书籍。
在简短的描述中,我发现了一个有趣的实现: 服务器和客户端计算游戏的物理特性。服务器将是主服务器,并且具有所有实体的正确状态,而客户端将尝试“预测”实体的状态并保持平滑的动画。 客户端将定期从服务器更新正确的实体状态。在某些游戏中,您可能会看到实体突然传送,这是因为客户预测的位置与服务器的实际位置不匹配。
实体状态,如球或球员,通常包含位置,速度,按钮状态(按键/按键)等信息。
除此之外,它让你的想象力疯狂,并测试最佳解决方案,看看哪些有效。需要考虑很多因素,例如播放器延迟和带宽。
答案 2 :(得分:2)
有一个专门用于游戏开发的stackexchange站点:https://gamedev.stackexchange.com/
最佳做法是仅发送客户需要了解的更新。此外,通常您发送用户操作的结果而不是操作本身。除了周期性同步点以解决随时间累积错误并与远程用户操作同步的浮点错误之外,不需要发送可以计算的东西(物理)。这也使得游戏看起来更具交互性,并且可以弥补网络延迟和抖动导致的一些口吃。
此模型的主要缺点是,如果您有较高的网络延迟或数据包丢失,当物理计算继续时,您将获得不同的时间轴效果,突然您从远程用户获得更新,表明他们做了一些有效的事情我们还没有抓到的物理学。但这是大多数网络游戏中的标准问题,对于大多数类型的实时游戏而言,替代方案更糟糕。