您如何允许在开发的后期阶段编写网络代码?


12

我目前正处于编写游戏的早期阶段,最终我希望在很多方面进行改进。
我该如何跳过编写网络代码的过程,却又很容易实现,即不必为了添加游戏而重写整个游戏。
我要记住什么?

我有一个组件模式,可以将物理/碰撞检测,游戏逻辑,数据类型和动画/渲染彼此分离。
如何编写没有实现任何网络代码但可以在本地测试的客户端和服务器?
我应该在客户端中做什么,然后在服务器中做什么?我是否应该假装自己已经完成网络代码,并在服务器和客户端之间发送消息并考虑到延迟等原因,即使没有延迟也是如此?

编辑:计划成为自上而下的RPG。我在想一个简单的多人游戏,在这里为朋友托管服务器,所以作弊并不是什么大问题(谁想和作弊的朋友一起玩?)。我仍然想采用“服务器永远是正确的”方法。

编辑2:我想我正在寻找一些关于我的思维定式的指针。我应该如何处理键盘输入,动画等,而不是立即应用所有效果/更改。嗯,毕竟,我可能需要适当地阅读网络知识,这是我希望通过制作某种可以在本地工作的网络框架来摆脱的东西。


这在很大程度上取决于您到达那里后计划如何实施网络代码。例如,雷神之锤(或后来的id标题,我的记忆有些模糊)采用了始终作为客户端/服务器的方法。甚至单人游戏选项实际上是在127.0.0.1上连接到服务器,并且没有邀请其他玩家-这意味着即使单人游戏也完全通过网络代码运行。
LLL79

这就是我的想法。也许是一些进程间的通信,这样您就不必在想独自玩耍时就连接起来,或者是一个类,它具有与客户端相同的功能,但可以像服务器一样立即处理它。
Ghork

3
最好的做法是“不要”一段时间。除非您正在编写回合制游戏,否则您只需设计不同的东西即可处理网络。如果您担心延迟,正确性和作弊,那么根本就没有解决方法。如果您不这样做,那么您就不需要真正考虑所有事情了-如果您没有经验,那么您将不会足够好地预测适当的设计。最好的方法是让您开始使用一些联网的原型,从而获得真正的联网经验。
a安2015年

如果考虑到这一点,即使在单人游戏中,Minecraft也具有本地服务器。服务器是引擎,客户端只是演示者。
SparK

Answers:


12

在不了解您正在编写的确切游戏以及如何编写游戏的情况下,很难说出解决问题的通用解决方案。

但是,您可能要考虑将网络代码放到最后的决定,具体取决于网络对您的游戏的重要性。

我的意思是,如果您要编写网络游戏,例如MMORPG,那么将网络留在最后可能不是明智的选择。

考虑到这一点,如果您期望对网络代码的影响很小(例如,根本没有网络代码不会破坏游戏),那么将其留待以后(但不要太晚)可能是合适的。

请记住,-编写-网络代码与-编写-网络代码不同。在决定游戏的制作方式时,应考虑这将如何影响网络决策,如果预期的影响很大,则可以将其实现为提供一些通用信息的存根,然后在何时编写网络代码,只需将其插入存根的位置即可。

因此,例如,如果您要制作在线国际象棋游戏,则可能有一个称为的函数ExecuteMove(),该函数在用鼠标输入一个动作时会以某种方式调用,而在通过键盘输入一个动作时会以另一种方式调用。此时,您可能要考虑创建一个网络存根,从另一个主机获取所需数据(这是您在后面的部分中写到的)后,该存根将调用ExecuteMove()

这样,在创建游戏时,您将知道哪些部分受网络代码的影响,并且当该是实际编写网络代码的时候,您将向前走几步。

如果这是您第一次编写网络游戏,请考虑不要对反作弊之类的东西考虑太多。制作网络游戏非常复杂,需要整个经验丰富的团队来完成AAA游戏,因此,请慢慢来,首先制作一款能够正常工作的游戏,然后再专注于更复杂的主题。

最后,如果这是您第一次制作游戏,请不要使其联网。制作游戏是如此复杂,以至于您添加到游戏中的每个要求都会使它成倍地复杂。


好吧,这不是MMO,因此不会对网络造成太大的负担。但是,这也不是一个过时的棋盘游戏,在此之前也可以花费几秒钟的时间。我觉得应该早点考虑联网,因为根据我的经验,在最后阶段添加多人游戏是行不通的。但是,我不想编写网络代码并对其进行调试,然后才能使角色移动并与对象碰撞。
Ghork 2015年

2
@Ghork:啊,您想看到您的产品尽快做得漂亮!好吧,是的,我们都做。但是屈服于这种诱惑并不会导致一个精心设计和深思熟虑的程序。
Lightness Races in Orbit

我会接受这个答案,尽管我也喜欢其他答案。特别是@Luaan
Ghork

2

我处于类似的情况,但是我想做的不仅仅是游戏,而是网络模拟。但我认为我的方法可能有助于您的设计过程。

我的方法是您对IPC(进程间通信)的评论。

首先,作为背景,我正在研究Steed和Oliveira的《网络图形》一书。这为根据各种标准和游戏类型的各种游戏网络架构提供了良好的背景。它提供了一个工具,可帮助您确定游戏的架构,要放在网络上的内容以及要在本地发生的内容。

其次,将网络组件分离到单独的后台线程中,这样您的初始游戏开发就可以在本地对组件进行编码,但是您不得不处理线程分离问题。不要将它们与以后将成为“本地背景”的任何其他功能结合使用,而是将其强制进入“潜在的远程”背景线程。

这应该有助于保持逻辑分离,还可以在过程中模拟网络延迟因素,以便您还可以看到延迟的影响。


猜猜我得把那本书结帐!听起来很有希望能够做到您所说的。
Ghork

@Ghork:关键是弄清楚您的体系结构,您想要的本地内容以及服务器上想要的内容;或您希望同伴如何交流和互动。那本书应该有帮助。然后,通过一组客户端服务器代码将您想要的所有内容放在IPC消息调用的另一端(目前)都保留在本地,但将“远程”内容保留在单独的线程上。在IPC消息传递组件中,人为地添加要模拟的任何延迟。祝好运!
Joe Van Steen

1

如果您正在学习所有这些知识,为什么不编写一个简单的单人版本1,而一旦您可以使用更深入的知识进行工作,就重新思考一下将成为多人版本2的整个过程。


0

实现一个“伪网络”类,该类在线程之间传递消息,该类具有与网络类相同的接口。稍后,您可以详细说明伪造的网络,使其具有随机的延迟和丢包。使用伪类调试网络代码总是比使用实际网络调试起来容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.