1

我正在尝试使用套接字为带有 java 后端的 Android 编写多人游戏,但我不知道该怎么做。

比如我要玩家。第一个玩家按下“向上”按钮,他的头像向上移动。我怎么能告诉所有其他玩家呢?

我可以发送消息,具有某些 ID 的用户将他的坐标更改为新的 X 和 Y,但我需要在他移动时每毫秒执行一次。那正确吗?

或者我可以发送消息,该用户具有某个 ID 按下了 UP 按钮,然后在该用户释放了 UP 按钮的新消息之后。使用这两个事件之间的时间差和移动速度我可以计算用户的新坐标,但在这种情况下会出现延迟问题(时间差计算不够准确)我该怎么做?

4

1 回答 1

5

您可以通过多种方式做到这一点,并且都会有您已经发现的缺点。我想没有“最好”的方法可以做到这一点。

游戏的一种常见方式是拥有一个“游戏服务器”。服务器接收来自所有客户端的输入并决定结果状态。

例如,客户端可以只传输按键,服务器会告诉他们他们的位置以及需要绘制的其他客户端的位置。客户端在本地执行相同的数学运算并在等待服务器确认时显示此状态。但这只是一个预测。

当它滞后时,您可以观察到自己在许多游戏中的位置之间跳跃,因为实际服务器计算的位置和您的预测不同步。

服务器端状态决策的另一个优点是客户端不能轻易作弊。防止每一次作弊都不是万无一失的方法。例如,瞄准机器人只是通过为他们移动鼠标来模拟完美瞄准的用户,而这基本上是不可检测的。另一方面,可以通过简单地不告诉客户当前不可见的东西来防止地图黑客/墙壁黑客(任何你可以看到你看不到的东西)。只有服务器需要知道完整状态。

服务器方法也可以在没有专用游戏服务器的情况下使用。相反,其中一个客户端将扮演服务器的角色并决定游戏状态。如果原始主机退出,该责任甚至可以在某些游戏中在客户端之间切换。不过,如果发生这种情况,顺利交接是相当棘手的。

如果没有服务器并且所有客户端都同样负责,您将不得不考虑定义哪个客户端负责验证哪个操作的模式。例如,在射手中,A 朝某个方向射击,并认为 B 还在那里,但 B 已经移动了一点,现在 A 认为“B 被击中”而 B 认为“射失”-> 要么是一次射击,要么是一个被击中的人应该决定会发生什么。

具有多个决策方的模式可能不适用于所有游戏,这是一项非常复杂的任务。不仅适用于游戏,也适用于一般的分布式计算

Java 和 Sockets 只是这里的工具。实际问题是您应该拿起笔和纸并考虑适用于您的场景的模式。

关于每毫秒的坐标:您还可以发送诸如“我将在时间 Z 的 X、Y 点”之类的消息,并且其他客户端会插入该玩家的路径,因此您不必传输每个位置。

于 2012-09-29T19:34:29.963 回答