OGRE 3D 自定义场景管理器中创建一个帧监听

#include "Ogre/Ogre.h"

//创建一个新的称为MyFrameListener,并列出三个公有的事件响应函数
class MyFrameListener:public Ogre::FrameListener
{
public:
 //首先声明frameStarted函数,现在这个函数以返回false来结束函数
 bool frameStart(const Ogre::FrameEvent &evt)
 {
  return false;
 }
 //同样需要一个frameEnded函数,也是返回false
 bool frameEnded(const Ogre::FrameEvent &evt)
 {
  return false;
 }
 //最后声明一个函数是frameRenderingQueued函数,也是返回false
 bool frameRenderingQueued(const Ogre::FrameEvent &evt)
 {
  return false;
 }
};

//创建有两个私有的指针的MyApplication类,一个指向Ogre 3D SceneManager,另一个指向Root类
class MyApplication
{
private:
 Ogre::SceneManager *_sceneManager;
 Ogre::Root *_root;
 //类的主体需要一个指针来存储FrameListener
 MyFrameListener *_listener;
public:
 //创建一个loadResources()函数,这个函数加载resources_d.cfg配置文件
 void loadResources()
 {
  Ogre::ConfigFile cf;
  cf.load("resources_d.cfg");
  //遍历配置文件的所有区段
  Ogre::ConfigFile::SectionIterator sectionIter = cf.getSectionIterator();
  Ogre::String sectionName,typeName,dataname;
  while(sectionIter.hasMoreElements())
  {
   //获取区段名称和设置迭代器
   sectionName = sectionIter.peekNextKey();
   Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();
   Ogre::ConfigFile::SettingsMultiMap::iterator i;
   //迭代所有的设置并添加每个资源
   for(i = settings->begin(); i != settings->end(); ++i)
   {
    typeName = i->first;
    dataname = i->second;
    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname,typeName,sectionName);
   }
   Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
  }
 }
 //创建一个startup()函数,使用plugins.cfg创建一个Ogre 3D Root类的实例
 int startup()
 {
  _root = new Ogre::Root("plugins_d.cfg");
  //显示配置窗口当用户退出时,返回-1并关闭程序
  if(!_root->showConfigDialog())
  {
   return -1;
  }
  //创建RenderWindow和SceneManager
  Ogre::RenderWindow *window = _root->initialise(true,"Ogre 3D Beginners Guide");
  _sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);
  //创建一个摄像机和视口
  Ogre::Camera *camera = _sceneManager->createCamera("Camera");
  camera->setPosition(Ogre::Vector3(0.0f,0.0f,50.0f));
  camera->lookAt(Ogre::Vector3(0.0f,0.0f,0.0f));
  camera->setNearClipDistance(5);
  Ogre::Viewport *viewport = window->addViewport(camera);
  viewport->setBackgroundColour(Ogre::ColourValue(0.0f,0.0f,0.0f));
  camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
  //调用函数来加载资源并创建一个场景,最后,Ogre3D可以开始渲染了
  loadResources();
  createScene();
  _listener = new MyFrameListener();
  _root->addFrameListener(_listener);//这句话在root渲染之前
  _root->startRendering();  
  return 0;
 }
 void createScene()
 {
  Ogre::Entity *ent = _sceneManager->createEntity("Sinbad.mesh");
  _sceneManager->getRootSceneNode()->attachObject(ent);
 }
 MyApplication()
 {
  _sceneManager = NULL;
  _root = NULL;
  _listener = NULL;
 }
 ~MyApplication()
 {
  delete _root;
  delete _listener;
 }
};

int main(void)
{
 MyApplication app;
 app.startup();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值