3

我目前正在开发 C++/SDL/OpenGL 游戏。我已经制作了一些小游戏,但只有本地游戏(没有网络代码)。所以我知道如何制作引擎,但我不确定网络代码。我可以先创建完整的分屏播放引擎,然后再添加网络代码,否则一切都会变得复杂吗?在编写基本游戏引擎时我是否已经必须考虑网络代码,或者在一台机器上运行良好后将它放在游戏之上也可以吗?

这是一个 2D 射击类型的游戏,如果这很重要的话。不,我不喜欢改变我对编程语言/窗口管理器/api 的选择,因为我已经实现了游戏的基本功能。我只是好奇如何最好地解决这个问题。

4

3 回答 3

2

理论上,您所需要的只是一个足够好的设计。写足够多的抽象类和 BAM!您可以为另一个(联网)弹出一个用户界面(即仅限本地)。不过,我不会相信这个理论。

可以做你想做的事,但它涉及到你在处理网络游戏时解决的所有新问题——同步多个用户的视图,当一个用户断开他们的网络链接时该怎么办(如何检测一个用户当然,断开他们的网络链接),接收用户输入的网络延迟,处理一侧而不是另一侧的延迟。网络编程完全不同,其中一些方面(主要是处理同步的方面)可能会影响您的核心引擎本身。即使“只显示两个视图”也会变得更加困难,因为您现在在两台完全不同的机器上拥有数据,而且数据不一定相同。

我的建议是做与你希望的相反的事情。首先使用最少的图形获取网络代码。事实上,控制台消息远比漂亮的图形更重要。您已经拥有制作其他游戏图形的经验——首先使用最有问题的技术。对网络代码会要求你做的所有事情有一个很好的感觉,然后专注于图形。

于 2013-03-25T17:32:55.943 回答
1

通常,对于面向网络的游戏,也要记住五个概念:

  • 事件
  • 调度员
  • 同步
  • 渲染
  • 模拟

事件。游戏引擎是一种事件软件,这意味着在游戏中每个通用对象(可以是单元、GUI 等)的状态下,您执行一个动作,这意味着您调用一个函数或什么也不做。

Dispatcher接受每个事件更改并将该更改分派到另一个子系统。

同步意味着在事件发生变化时,必须通知网络中的所有客户端将其调度员扔掉该变化,这样所有玩家都可以看到其他玩家的变化,同时渲染和模拟相同的事物。

渲染渲染读取每个对象的参数和相关状态并在屏幕上绘制。例如,您是否为每个单位都有一个名为life_points的属性,如果life_points>50,您可以绘制一个普通单位,如果life_point>0life_point<50 ,您可以绘制一个损坏单位,如果life_point=0 ,您可以绘制一个被摧毁的单位。渲染不要对对象进行更改,只需绘制从它们读取的内容。

模拟读取每个对象并执行一些任务以计数状态和属性,例如,如果您有 cero 生命点,您将一个单元的状态标记为 DEAD(例如)或更改 de GUI,或者如果一个单元接近到另一个敌方队伍,您将状态从静态更改为移动靠近另一个单位。另外,在这里你可以制作单位的物理特性、改变位置、旋转等等……因为你让所有对象都通过网络同步,每个人都会看到同样的事情。

此致。

于 2013-03-26T15:14:06.407 回答
0

尽快添加网络代码。如果你不这样做,你可能不得不在开发周期的后期对引擎进行大修,所以最好尽早进行。

这也取决于游戏的复杂程度,但同样的原则仍然有效。最好不要在最后一秒添加

希望这可以帮助!

于 2013-03-25T17:22:30.743 回答