Node.js游戏逻辑

我正在制作实时多人赛车游戏。 现在我需要在Node.js TCP(net)服务器上编写游戏逻辑。 我不知道是否有可能,我不知道我是否做得对,但我正在努力。 我知道这很难理解我的英文,所以我做了这个“绘画”:)
感谢您的时间
Proccess

为了详细说明driushkin的答案,你应该使用远程过程调用(RPC)和一个事件队列。 这就像在你发布的图像中一样,每个数据包代表一个“命令”或带有一些参数(即移动方向)的RPC。 您还需要一个事件队列来确保按顺序和按时执行RPC。 这将需要每个命令(在未来某个时刻,在一个简单的scheme)和同步手表(二战风格)执行时间戳或帧数。

您可能会注意到此scheme中的一个关键弱点:由于networking延迟,恶意用户等原因,RPC消息可能迟到(在应用之后到达)。在一个简单的scheme中,延迟的RPC将被丢弃。 这是没有问题的,因为所有的客户端(甚至是发起者)都等待服务器在动作之前发送一个RPC(如果发起的客户端没有等待服务器消息,他的游戏状态将与服务器不同步,游戏将被打破)。

考虑滞后对这种scheme的影响。 客户A到服务器的延迟是100ms,回程也是100ms。 这意味着客户端input如下所示:

  • 客户端A按键,并将RPC发送到服务器, 但不在本地添加 (0ms)
  • 服务器接收并重播RPC(100ms)
  • 客户端A收到他自己的事件,现在最终将其添加到他的事件队列进行处理(200ms)

正如你所看到的,客户在按下按键之后,会在1/5秒内对自己的事件做出反应。 这是相当不错的100毫秒滞后。 跨洋滞后很容易超过200ms,拨号连接(罕见,但现在仍然存在)可能会出现大于500ms的滞后峰值。 如果你在局域网或类似的地方玩游戏,这一切都不重要,但是在互联网上,这种无react native可能是无法忍受的。

这就是客户端预测(CSP)的概念所在.CSP被认为是大而可怕的,但是正确实施,其实很简单。 CSP的有趣function是客户可以立即处理他们的input (客户预测会发生什么)。 当然,客户可以(而且往往会)是错的。 这意味着客户端将需要从服务器应用更正的方法。 这意味着你将需要一种方法让服务器validation,拒绝或修改来自客户端的RPC请求,以及序列化游戏状态的方法(因此它可以作为基点来恢复)。

这样做有很多很好的资源。 我特别喜欢http://www.gabrielgambetta.com/?p=22 ,但你应该真的找一个好的多人游戏编程书。


即使阅读了关于Flex和AS3的评论,我也必须build议socket.io。 易用性(以及与节点的简单集成)使其成为我曾经使用的通过HTTP进行networking游戏的最佳(最好的)选项之一。 我会做任何必要的调整,以便能够使用它。 我相信,即使socket.io本身不可用,AIR / AS3也至less有一个WebSockets库。

这听起来像socket.io将是伟大的。 这是一个图书馆,让你在浏览器和服务器上的实时可能性。

您可以在events中的commands中对此进行build模:客户端将命令move到服务器,然后服务器validation此命令,如果一切正常,则发布事件is moving

在你的情况下,可能不需要对P1做出不同的反应(可以移动),其余的(P1正在移动),后者在这两种情况下都足够了。 is moving事件应包含所有必要的信息(如当前位置,速度等)。

以这种最简单的forms,一个发布命令会经历一些延迟,直到从服务器到达的事件发生,并且为了避免您可以立即开始移动,并且在事件到达时如果有必要应用一些补偿行为。 但是这可能会变得复杂。