c++ - Main 函数与状态之间的通信

标签 c++ oop design-patterns communication

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

主要特点是创建所谓的系统,涵盖游戏菜单和游戏关卡。这些系统提供了诸如 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();
     ...
}

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

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

最佳答案

我认为你在这里试图做的是组织一个完整的模型- View - Controller 架构,你在这里提供的代码是它的模型和 Controller 部分。看网上关于MVC的一些解释:

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

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

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

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

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

关于c++ - Main 函数与状态之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769279/

相关文章:

design-patterns - 哪些设计模式未被充分利用?

c++ - steady_clock 在 windows/cygwin 上是否只有 10ms 分辨率?

c++ - 编辑链表中的数据错误: no match for operator==

c++ - Pybind11:如何为结构成员变量分配默认值?

c++ - 在多重继承中避免菱形

oop - 什么设计模式或反模式?

c++ - 在 Mac 上获取系统时区的 UTC 偏移量 (C++)

php - 数据映射器和 zend 框架

oop - 为什么 Rust 不支持特征对象向上转换?

c++ - 如何复制列表 vector ?