具有物理特性的2D游戏的多人/网络选项

时间:2011-02-27 19:31:33

标签: c++ networking physics multiplayer

要点:

我的50%使用Box2D完成2D侧面滚动,因为物理引擎应该在最终版本中支持多人游戏。但是,目前的代码只是一个单人游戏。

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

单人游戏中的表现应尽可能好(使用环回服务器模拟物理实现单人游戏模式会有问题)

完整背景/问题:

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

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

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

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

所以我在这里,用我的半完成的2D sidescroller游戏,我真的不知道如何继续。

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

首先,对于任何可能发现自己处于这种情况的人来说,这是一个普遍的问题:

  • 我该怎么办?

然后,更具体的一个 - 我一直试图找出如何为我的游戏接近网络部分:

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

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

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

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

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

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

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

我不确定这是怎么回事。但至少我认为会有很多额外的工作,因为所有的单人游戏功能都必须重新实现或粘贴到多人游戏模式。

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

这只是我的一个快速思考。多人游戏可以包含单人游戏,加载一个额外的网络模块并连接到服务器,该服务器可以发送和接收数据并更新单人游戏世界。

在回顾展中,我很遗憾没有提前计划过多人游戏模式。我真的很困难,我希望有人能够帮助我!

2 个答案:

答案 0 :(得分:2)

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

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

此时有两种基本模型可供选择: 一个专用的服务器程序,可以完成游戏的所有大脑并让客户端连接。 一种监听服务器,其中游戏基本上可以充当服务器或客户端,具体取决于用户设置。没有单独的服务器程序。

制作客户端的最简单方法是在对象中添加“虚拟”标志,以便服务器直接控制这些虚拟对象。然后,进入插值。 (以60赫兹传输对象更新是不现实的,因此点之间的平滑使得事情看起来仍然很好。来源通过添加一点人工滞后来实现这一点,如果您曾经在低于标准的互联网连接上玩GTA4多人游戏,您可以看到效果在快车上过度。)

另外,建议阅读: http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

答案 1 :(得分:1)

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

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

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

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


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