在这一章中我们将学习一个非常重要的概念:帧监听,我们将和大家一起学习怎样使用帧监听的功能去对每一帧需要更新的内容更新,另外,我们还会学习怎样使用前面我们提到过的OIS的输入系统。
帧监听
这一小节我们同样使用前面我们已经定义好的模板代码,不过我们需要做些许改动,我们知道我们定义的那个Example1类,我们让它继承了ExampleApplication类,但我们也知道C++支持多继承,因此现在我们让它再继承一个类FrameListener,因为这里封装了我们需要的所有帧监听的操作,继承这个类之后我们需要重写几个FrameListener中定义的虚函数,以便我们可以对每帧的更新操作进行控制,下面是继承了FrameListener并重写了对应的函数后的完整代码:
第一步:
#include <windows.h> #include "ExampleApplication.h"
class Example1 : public ExampleApplication,public Ogre::FrameListener { public: void createScene() { }
bool frameStarted(const FrameEvent& evt) { return true; } bool frameRenderingQueued(const FrameEvent& evt) { return true; } bool frameEnded(const FrameEvent& evt) { return true; } protected: private: };
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { Example1 app; app.go(); return 0; } |
第二步:完成上面的代码后,我们给Example1类新添加一个成员变量,如下所示:
private: Ogre::SceneNode*m_Node; |
第三步:添加Example1的一个构造函数,把我们新添加的成员变量m_Node初始化为NULL:
Example1() { m_Node = NULL; } |
第四部:向frameStarted成员函数中添加如下代码:
bool frameStarted(const FrameEvent& evt) { if (m_Node) { m_Node->translate(Ogre::Vector3(0.1,0,0)); } return true; } |
第五步:给Example1类新增加一个createFrameListener的函数,这个函数和前面我们提到过的createCamera已经createViewports等函数一样,都是在ExampleApplication中定义的虚函数:
void createFrameListener() { mRoot->addFrameListener(this); } |
第六步:我们在createScene函数中添加一个实体,并实例化m_Node,以便我们能看到效果:
void createScene() { Ogre::Entity*ent = mSceneMgr->createEntity("Sinbad","Sinbad.mesh"); m_Node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); m_Node->setScale(10.0f,10.0f,10.0f); m_Node->attachObject(ent); } |
到此为止帧监听的大部分工作我们已经完成,我们可以编译并运行程序,我们会看到场景中有个人物不断的向右移动。但是请读者朋友注意,一旦我们运行这个程序,我们“很难”将其真正关闭,之所以这样说是因为我们并没有对退出当前的应用程序做任何处理,因此,你将会发现当我们像