2012-03-24 122 views
1

我在写FPS XNA游戏。这会是多人,所以我想出了以下内容:为FPS游戏编写XNA游戏服务器的最佳方式是什么?

  1. 我做两个不同的组件 - 一个用于游戏逻辑和第二绘制它与游戏无关的东西(像火箭步道)。
  2. 连接的类型是客户端 - 服务器(不是对等),因此每个客户端首先连接到服务器,然后游戏开始。
  3. 我完全决定使用XNA.Framework.Game类来让客户在窗口(或全屏)中运行游戏,并且使用GameComponent/DrawableGameComponent类来存储游戏对象并更新&在每一帧上绘制它们。

接下来,我想找到问题的答案:

我应该在服务器端呢?我有几个选择:

  1. 在服务器上创建我自己的Game类,它将处理所有的游戏逻辑(只有,没有图形)。我不使用标准Game类的原因是当我打电话给Game.Run()时出现白色窗口,我无法弄清楚如何摆脱它。
  2. 使用某种方式原始XNA的Game类,这是已经有GameComponent收集和更新事件(每秒60次,正是我需要的)。

UPDATE:

我得到了更多的问题:

首先,我应该用什么插座模式? TCP还是UDP?而如何居然让客户知道这,就是要处理后一个

其次,如果我打算使用exacly GameComponent类将其存储和处理服务器的游戏对象,如何让他们在客户端上绘制?继承他们(当他们被结合到一个组件)?还有别的吗?

回答

1

首先,你的游戏逻辑应该是在服务器上..这不仅会防止作弊,但它也garantees一致性,尤其是在随机操作。客户端只能发送其输入到服务器

我建议你保持服务器的窗口中可见使它成为一个调试控制台,你会需要它,知道你的服务器正在做的正是。

对于FPS,推荐使用UDP。您将发送大量数据,并且您并不在乎您的数据包是全部收到还是订购。虽然数据包是不保证到达有序,你真的不必担心它。大多数时候,他们都会按顺序到达。假设您每秒发送60帧到您的客户端,并且您的数据包之一以错误的顺序到达:您的客户端将有1/60秒的错误信息,这几乎不可见。

最后,您应该每秒向您的客户发送一次您的游戏状态的序列化表示。他们应该能够检索这些信息并以与服务器相同的方式绘制它们。如果您认为合适,您甚至可以序列化您的游戏组件并发送它。这真的取决于你自己决定。

希望这会有所帮助!

+0

这真的很有帮助。 – AgentFire 2012-03-27 07:02:37