0

我考虑使用以下设计方法构建游戏引擎。

主要特点是创建所谓的系统,涵盖游戏菜单和游戏关卡。这些系统提供了诸如Window绘图、Input获取、Sound播放以及可能Network与服务器通信之类的对象。

class System // abstract class
{
     Window* Window;
     Input* Input;
     ...

     System(Window* Window, Input* Input, ...)
     {
          this->Window = Window;
          this->Input= Input;
          ...
     }

     virtual Pause() = 0;
     virtual Resume() = 0;
}

主要功能处理系统因此菜单和级别。说LevelOne是从System.

int main()
{
     LevelOne Tutorial(&Window, &Input, ...); 
     Tutorial.Pause();
     ...
}

这样我的代码就变得结构化并且(在我看来)易于理解。但是 main 函数如何与系统通信呢?

例如,菜单如何告诉主功能用户选择了一个级别,以及选择了哪个级别?为了让主函数删除菜单并创建一个新的关卡对象。

4

1 回答 1

1

我认为您在这里要做的是组织一个完整的模型-视图-控制器架构,您在这里提供的代码是它的模型和控制器部分。查看网上关于 MVC 的一些解释:

http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html

如果您有一个 main() 函数尝试侦听来自子系统的消息并因此调用适当的操作,则您正在尝试实现单线程反应式消息循环。您可以考虑运行一个 ACE 反应器,它可以侦听 Qt GUI 消息以及网络事件等其他消息,然后适当地调用您的子系统(尽管可能存在一些性能问题):

http://www.cs.wustl.edu/~schmidt/PDF/reactor-rules.pdf

我不熟悉用于视频游戏编程的图形引擎,但大多数图形库在其初始化期间为您提供了一个消息循环,不需要您了解此类细节。您通常需要做的就是创建图形对象并将它们注册到库的主消息循环中。

与侦听图形事件的消息线程相比,我建议使用单独的线程侦听网络事件。它将工作分开并有助于提高图形的性能。

于 2012-10-07T14:39:35.323 回答