我考虑用以下设计方法构建一个游戏引擎。
主要特点是创建所谓的系统,包括游戏菜单和游戏级别。这些系统提供了像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();
...
}
通过这种方式,我的代码变得结构化并且(在我看来)易于理解。但是,主要功能如何与系统通信呢?
例如,菜单如何告诉主功能用户已经选择了一个级别,以及哪个级别?为了让主功能删除菜单并创建一个新的级别对象。
我认为你在这里试图做的是组织一个完整的模型-视图-控制器架构,你在这里提供的代码是它的模型和控制器部分
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
我不熟悉视频游戏编程的图形引擎,但大多数图形库在初始化过程中都为您提供了一个消息循环,不需要您了解此类细节。您通常所要做的就是创建图形对象,并将它们注册到库的主消息循环中。
与监听图形事件的消息线程相比,我建议使用单独的线程监听网络事件。它将工作区分开,有助于提高图形的性能。