您可以通过多种方式做到这一点,并且都会有您已经发现的缺点。我想没有“最好”的方法可以做到这一点。
游戏的一种常见方式是拥有一个“游戏服务器”。服务器接收来自所有客户端的输入并决定结果状态。
例如,客户端可以只传输按键,服务器会告诉他们他们的位置以及需要绘制的其他客户端的位置。客户端在本地执行相同的数学运算并在等待服务器确认时显示此状态。但这只是一个预测。
当它滞后时,您可以观察到自己在许多游戏中的位置之间跳跃,因为实际服务器计算的位置和您的预测不同步。
服务器端状态决策的另一个优点是客户端不能轻易作弊。防止每一次作弊都不是万无一失的方法。例如,瞄准机器人只是通过为他们移动鼠标来模拟完美瞄准的用户,而这基本上是不可检测的。另一方面,可以通过简单地不告诉客户当前不可见的东西来防止地图黑客/墙壁黑客(任何你可以看到你看不到的东西)。只有服务器需要知道完整状态。
服务器方法也可以在没有专用游戏服务器的情况下使用。相反,其中一个客户端将扮演服务器的角色并决定游戏状态。如果原始主机退出,该责任甚至可以在某些游戏中在客户端之间切换。不过,如果发生这种情况,顺利交接是相当棘手的。
如果没有服务器并且所有客户端都同样负责,您将不得不考虑定义哪个客户端负责验证哪个操作的模式。例如,在射手中,A 朝某个方向射击,并认为 B 还在那里,但 B 已经移动了一点,现在 A 认为“B 被击中”而 B 认为“射失”-> 要么是一次射击,要么是一个被击中的人应该决定会发生什么。
具有多个决策方的模式可能不适用于所有游戏,这是一项非常复杂的任务。不仅适用于游戏,也适用于一般的分布式计算
Java 和 Sockets 只是这里的工具。实际问题是您应该拿起笔和纸并考虑适用于您的场景的模式。
关于每毫秒的坐标:您还可以发送诸如“我将在时间 Z 的 X、Y 点”之类的消息,并且其他客户端会插入该玩家的路径,因此您不必传输每个位置。