我制作了一个TCP网络RTS,在其中我自己传递了命令,而不是命令的结果。例如,玩家发出移动指令。如果移动订单根据该客户端有效,则将其发送到服务器。然后,服务器将其发送回所有客户端,由它们进行验证和执行。
因此,所有客户端计算机自己运行游戏,服务器代码接受消息并将其发送回所有客户端。如果客户给出了移动指令,则直到从服务器收到回单后,它才会开始执行。
服务器还会发送一个“ tick”号来执行该命令,该编号比“当前” tick提前几个tick。这样,所有命令都可以在所有计算机上以相同的“刻度”执行。
这种方法的一个好处是它不依赖任何单个客户端计算机来验证命令。如果我通过了移动的结果,我也许可以破解它以更快地移动我的单位。所有客户端都必须执行同一命令,并且如果一台计算机以不同的方式执行该命令,这将是显而易见的。
在将命令发送到服务器之前不需要在客户端进行验证,但是从理论上讲,它可以节省网络流量。我使用了相同的验证代码来告诉UI可以进行此操作,因此不需要编写额外的代码。
至于消息可能是什么样子。我并不担心超高效率,因为这是我的第一款网络游戏。我将命令作为字符串传递。命令的格式如下:"<player_id>:<command>:<parameters>"
对于一个人为的示例,移动命令可能如下所示: "3:move:522:100:200"。这意味着玩家3要move单位522给(100,200)。
服务器将命令传递给所有客户端(包括发送该命令的客户端),并带有以下标记号:"153238:3:move:522:100:200"。
然后,在执行订单号153238时,客户端将全部执行此命令。