前面写过了dtCore::Base的一些学习体会,现在往下说说dtCore::System。在接触过的几个仿真引擎中(貌似只有vp和Delta3d)都使用了这个作为高级帧控制手段。如果要想将引擎开发出来的项目塞到MFC这类东东中也就需要自己手动来使用它了。其实应该是重新dtABC::Application 并在里面调用System的函数。那么了解它也就变得很重要了。尤其对我这种入门级菜鸟来说。
由于里面的内容比较多,我准备将其分为两个部分来说:
1 它是如何控制帧的 根据自身状态发送消息
2 它是根据什么来控制帧的 系统时间,自身状态 , 真实时间 模拟时间
先列出该类中一部分函数和内置变量吧
先看下System的构造函数吧。这里其构造函数是私有的,也就是说你没法建立实例,其实不然,就像很多这种核心部分的类一样,它提供了一个GetInstance()来获取System的引用。
System& System::GetInstance()
{
if (!mInstanceFlag)
{
mSystem = new System();
mSystem->SetName("System");
mInstanceFlag = true;
}
return *mSystem;
}
其中mSystem是一个静态指针,这样就可以保证一个应用程序中只含有一个System实体,并且像《Effective c++》中说的,通过静态函数中创建的静态变量是顺序一定的。想要销毁System时可以直接调用静态函数Destroy()来完成。
已经知道了如何获取一个System实体后,我们来看一下他到底是如何根据所设置的控制状态标识符控制帧的。
可以通过以下方式来开启和关闭System所发送的特定控制消息。
上述每个状态都对应一个消息。通过控制当前状态来控制该消息是否被发出。
例如:如果SetSystemStages中没有设置STAGE_EVENT_TRAVERSAL的话,则不会发出
MESSAGE_EVENT_TRAVERSAL消息,那么也就不会有输入事件,窗口事件被监听到。
System类根据SystemStages判断是否向app类发送消息。关于所发送消息的部分说明如下所示:
上述消息中关于摄像机的注释可能有些偏差,我会在过后确定后再行修改。
与上述消息对应的函数如下所示
这些事件是如何被发送到BaseABC的我们在前文里面也已经提过了。至于之后引起了什么样的行为,当我们谈到dtABC命名空间时在具体讨论
好了往下我们开始进入帧循环看看这些消息分别在什么情况下被发送出去的。在这里我们先不管关于时间部分 那是下部分要说的 在这我们只关注它的逻辑部分。
从上面的函数我们可以看出 在进入帧循环前,我们先要使用InitVars()配置参数,在这个函数里面配置了很多跟时间有关的参数-_-! 然后进入帧循环
这里在调用SystemStep()函数以后进行了一个判断是否还有窗口,如果窗口都挂掉了也就自动跳出帧循环了。在这里DECLARE_MANAGEMENT_LAYER终于起到作用了,而且还很管用。关于System跟窗口的关系我还没搞明白呢。-_-!以后补上
OK 就先到这了 再往下进行的话就跟那些各种各样的时间参数有关了,还是留在下回说吧-_-!另外System在帧控制方面还有很多函数可以进行灵活的配置,这里就不一一说了。
PS 话说每回写学习笔记写完都感觉自己跟小白一样,这么显而易见的东西有什么写的-_-!到最后总变成自己鄙视自己。 哦 最后提一句 我竟然没有找到CameraFrame()函数的实现…可能是天黑了脑袋有点晕了。@_@
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sxy0082002/archive/2009/06/30/4308340.aspx