一个带有物理引擎的2D游戏的多人/网络选项

4

摘要:

我的使用Box2D作为物理引擎的2D侧卷游戏在最终版本中应该支持多人游戏,但当前代码只是单人游戏。

  • 我现在该怎么做?
  • 更重要的是,我应该如何实现多人游戏并将其与单人游戏结合起来?
  • 像Notch在Minecraft中那样,分别编写单人游戏和多人游戏是不是个坏主意?

单人游戏的性能应该尽可能好(使用回路服务器模拟物理会有问题)

完整背景/问题:

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

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

我认为多人游戏支持可以相对容易和清晰地添加到几乎完成的单人游戏中,但显然,从我所读到的内容来看,这是错误的。

我甚至读到说,多人游戏应该从一开始就作为一个游戏来编程,而单人模式实际上只是通过主持一个不可见的本地服务器并通过回路连接到它。(我发现大多数FPS游戏引擎都是这样做的,例如Source)

所以,我在这里,有了我的半成品2D侧卷游戏,我真的不知道该怎么办了。

继续开发单人/客户端似乎对我来说毫无意义,因为以后我还需要重新编码和重构更多内容。

首先,向任何可能遇到这种情况的人提出一个一般性问题:

  • 我该如何继续?

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

  • 单人游戏的不可见/回路服务器

这将具有优点,因为单人游戏和多人游戏之间基本上没有区别。不需要太多额外的代码。

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

即使您通过线程之间的直接通信提供了数据的直接路径,单人游戏也会受到限制。

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

  • 分离的单人游戏/多人游戏模式

在单人游戏模式中不涉及服务器。

我不太确定这该怎么实现。但至少我认为会有大量的额外工作,因为所有单人游戏功能都必须重新实施或粘合到多人游戏模式中。
多人游戏模式作为单人游戏的模块
这只是我突然想到的一个快速想法。多人游戏可以由单人游戏组成,加载一个附加的网络模块并连接到服务器,发送和接收数据并更新单人游戏世界。
回顾过去,我后悔没有早些计划多人游戏模式。我现在真的卡住了,希望这里的某个人能帮助我!

1
有一个游戏开发者问答社区 http://gamedev.stackexchange.com/ - CodesInChaos
2个回答

2
我认为Notch正在感受到开发SP和SMP分别的痛苦。特别是因为他告诉Bukkit开发团队,他计划转向“单人游戏本地服务器”方法(就像您所说的Source Engine)。 您不必运行多个物理模拟,本地服务器与客户端之间的延迟可以忽略不计,并且可以完全禁用延迟补偿。
此时,您可以采用两种基本模型: 一个专用服务器程序,它执行您的游戏所有操作并允许客户端连接。 一个侦听服务器,其中游戏可以根据用户设置基本上充当服务器或客户端。没有单独的服务器程序。
制作客户端最简单的方法是向对象添加“虚拟”标志,以便这些虚拟对象将直接由服务器控制。然后,进入插值。 (以60 Hz传输对象更新是不现实的,因此在点之间平滑处理使事物看起来仍然很好。如果您曾经在互联网连接不佳的情况下玩过GTA4 Multiplayer,则可以看到快速汽车上的效果被过度强调。)
此外,推荐阅读: http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

值得一提的是,“SMP”指的是“生存多人游戏”,它是以Minecraft中添加的“生存”游戏模式命名的(实际上,它已经取代了原始创造模式)。因此,第一句话指的是在Minecraft中单人和多人游戏目前有些分开开发。 - Tamás Szelei

1

你可以使用简单的渲染终端方法。优点是相对容易集成,而不需要从一开始就设计到引擎中。缺点是无法使用预测技术来补偿延迟,并且如果有许多可见对象,则带宽可能很高。

一个想法是将游戏状态及其演变与图形分离。因此,每个帧都将游戏状态转换为图形表示(剔除屏幕外的内容)。然后在单人游戏中直接呈现该图形,而在多人游戏中将该图形表示发送到网络上。并将输入发送到服务器。

这种方法的有效性取决于绘制对象的数量以及它们的图形描述的复杂程度。但是对于2D游戏来说,该描述通常非常小。

我希望这在局域网中能够良好运行,因为它具有良好的延迟和带宽。但不知道在互联网上的表现如何。


这是一篇介绍虚幻引擎网络代码工作方式的文档。在介绍中,提到了几种更简单的方法。你可以考虑实现其中一种。 http://unreal.epicgames.com/Network.htm


这是一个有趣的想法,但我认为它不适合我的游戏,因为需要同步的不仅仅是图形。我也不确定如何在多个玩家之间实现这个想法。 - lamas
除了图形之外,您还需要向用户发送什么?对于多个客户端,您将向每个客户端发送其自己的图形。 - CodesInChaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接