4

概括:

我使用 Box2D 作为物理引擎的 50% 完成的 2D 横向卷轴应该在最终版本中支持多人游戏。然而,目前的代码只是一个单人游戏。

  • 我现在该怎么办?
  • 更重要的是,我应该如何实现多人游戏并将其与单人游戏结合起来?
  • 将单人模式与多人模式分开编码是不是一个坏主意(就像 Notch 用 Minecraft 做的那样)?

单人游戏的性能应该尽可能好(使用环回服务器模拟物理来实现单人游戏模式将是一个问题)

完整背景/问题:

我正在使用 C++ 开发一个相对较大的 2D 游戏项目,其中物理是它的核心元素。(我为此使用 Box2D)

完成的游戏应该有完整的多人游戏支持,但是我犯了一个错误,我没有正确规划网络部分,直到现在基本上都在做单人游戏。

我认为可以以相对简单明了的方式将多人支持添加到几乎完成的单人游戏中,但显然,从我所读到的内容来看这是错误的。

我什至读到多人游戏应该从一开始就被编程,单人游戏模式实际上只包括托管一个不可见的本地服务器并通过环回连接到它。(我发现大多数 FPS 游戏引擎都是这样做的,例如 Source)

所以我在这里,完成了一半的 2D 横向卷轴游戏,我真的不知道如何继续。

简单地继续在单人/客户端上工作现在对我来说似乎毫无用处,因为我必须在以后重新编码和重构。

首先,向任何可能发现自己处于这种情况的人提出一个一般性问题:

  • 我应该如何进行?

然后,更具体的一个 - 我一直在尝试找出如何处理我的游戏的网络部分:

  • 单人游戏的隐形/环回服务器

这样做的好处是单人模式和多人模式之间基本上没有区别。不需要太多额外的代码。

一个很大的缺点:单人游戏中的性能和其他限制。将运行两个物理模拟。一个用于客户端,一个用于环回服务器。

即使您通过为来自回送服务器的数据提供直接路径来解决问题,例如通过线程的直接通信,单人游戏也会受到限制。

这是一个问题,因为应该允许人们同时玩大量的物体。

  • 分离的单人/多人模式

单人模式不会涉及服务器。

我不确定这将如何工作。但至少我认为会有很多额外的工作,因为所有的单人游戏功能都必须重新实现或绑定到多人游戏模式。

  • 多人模式作为单人游戏的模块

这只是我的一个快速想法。多人游戏可以由单人游戏组成,附加一个加载并连接到服务器的网络模块,该服务器发送和接收数据并更新单人游戏世界。

在回顾中,我很遗憾没有早点计划多人模式。我真的被困在这一点上,我希望这里有人能够帮助我!

4

2 回答 2

2

我认为Notch正在感受分开开发SP和SMP的痛苦。特别是因为他告诉 Bukkit 开发团队他正计划过渡到“单人本地服务器”方法(正如你所说,就像源引擎一样。)

没有理由必须运行多个物理模拟,本地服务器和客户端之间的延迟可以忽略不计,延迟补偿可以完全禁用。

此时您可以使用两种基本模型: 一个专门的服务器程序,它可以完成您游戏的所有大脑并让客户端连接。根据用户设置,游戏基本上可以充当服务器或客户端的侦听服务器。没有单独的服务器程序。

制作客户端的最简单方法是向您的对象添加“虚拟”标志,以便这些虚拟对象将由服务器直接控制。然后,进入插值。(以 60 Hz 传输对象更新是不切实际的,所以点之间的平滑让事情看起来仍然很好。Source 通过添加一点人为延迟来做到这一点,如果你曾经在低于标准的互联网连接上玩过 GTA4 多人游戏,你可以看到效果在快车上过度使用。)

另外,推荐阅读:http: //developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

于 2011-02-27T19:54:59.000 回答
1

您可以使用哑渲染终端方法。优点是它相对容易集成,无需从一开始就将其设计到您的引擎中。缺点是使用预测技术无法补偿延迟,如果可见对象很多,带宽可能会很高。

一个想法是将游戏状态及其演变与图形分开。因此,您将游戏状态转换为图形表示的每一帧(剔除屏幕外的东西)。然后在单人游戏中直接渲染,在多人游戏中通过网络发送图形表示。并通过网络将输入发送到服务器。

效果如何取决于绘制对象的数量及其图形描述的复杂程度。但是对于 2D 游戏来说,这种描述通常相当小。

我希望这在 LAN 中运行良好,因为它具有良好的延迟和带宽。不知道它在互联网上的效果如何。


这是描述虚幻网络代码如何工作的文档。并在介绍中介绍了几种更简单的方法。您可能想要实现其中之一。 http://unreal.epicgames.com/Network.htm

于 2011-02-27T19:39:11.377 回答