何时开始担心网络代码?

时间:2013-03-25 17:14:58

标签: c++ sockets game-engine multiplayer

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

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

3 个答案:

答案 0 :(得分:2)

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

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

我的建议是做与你所希望的相反的事情。首先使用最少的图形获取网络代码。事实上,控制台消息将比漂亮的图形重要得多。您已经拥有制作其他游戏图形的经验 - 首先是最有问题的技术。仔细了解网络代码会对您提出的所有问题,然后再关注图形。

答案 1 :(得分:1)

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

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

<强>活动即可。游戏引擎是一个事件软件,意味着在游戏中每个通用对象的状态(可以是一个单元,GUI等),你做一个动作,这意味着,你调用一个函数或什么都不做。

Dispatcher 更改每个事件并将更改分派给另一个子系统。

同步意味着在事件发生变化时,必须建议网络中的所有客户端将其调度员抛给该变更,这样所有玩家都可以看到其他玩家的变化,渲染和模拟事情在同一时间。

渲染渲染读取参数和每个对象的相关状态并在屏幕中绘制。例如,如果您拥有名为 life_points 的每个单元的属性,则可以在 life_points> 50 时绘制正常单位,如果 life_point&gt; 0 <则可以绘制伤害单位/ i>和 life_point&lt; 50 life_point = 0 时被破坏的单位。渲染不要在对象中进行更改,只需绘制从中读取的内容。

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

最好的问候。

答案 2 :(得分:0)

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

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

希望这有帮助!