我考虑使用以下设计方法构建游戏引擎。
主要特征是创建所谓的系统,涵盖游戏菜单和游戏关卡。这些系统提供了诸如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函数删除菜单并创建一个新的关卡对象。
答案 0 :(得分:1)
我认为你在这里要做的是组织一个完整的模型 - 视图 - 控制器架构,你在这里提供的代码是它的模型和控制器部分。在网上看到关于MVC的一些解释:
http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html
如果您有一个main()函数试图侦听来自子系统的消息并因此调用相应的操作,那么您正在尝试实现单线程响应消息循环。您可以考虑运行可以侦听Qt GUI消息以及其他网络事件的ACE反应器,然后适当地调用您的子系统(尽管可能存在一些性能问题):
http://www.cs.wustl.edu/~schmidt/PDF/reactor-rules.pdf
我不熟悉用于视频游戏编程的图形引擎,但是大多数图形库在初始化期间为您提供了一个消息循环,不需要您经历这种细节。您通常要做的就是创建图形对象并使用库的主消息循环注册它们。
我建议使用一个单独的线程来监听网络事件,而不是你的消息线程监听图形事件。它将工作分开,有助于提高图形性能。