开发环境:
CEGUI 0.74,OGRE 1.72
教程:
CEGUI and Ogre
The Beginners Guide to Getting CEGUI Rendering
http://www.cegui.org.uk/api_reference/rendering_tutorial.html
使用步骤:
1、创建“引导函数”
// Bootstrap CEGUI::System with an OgreRenderer object that uses the
// default Ogre rendering window as the default output surface, an Ogre based
// ResourceProvider, and an Ogre based ImageCodec.
CEGUI::OgreRenderer& myRenderer = CEGUI::OgreRenderer::bootstrapSystem();
2、创建CEGUI::Renderer实例
// Create an OgreRenderer object that uses the default Ogre rendering // window as the default output surface. CEGUI::OgreRenderer& myRenderer = CEGUI::OgreRenderer::create();
3、注入按键事件
CEGUI::System &sys = CEGUI::System::getSingleton();//!按下 ,同事需要注入字符,以便于处理非英语国家的utf8字符
sys.injectKeyDown(arg.key); sys.injectChar(arg.text);//! 按键弹起CEGUI::System::getSingleton().injectKeyUp(arg.key);4、注入鼠标事件CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));CEGUI::System &sys = CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
以上完成了CEGUI嵌入OGRE的框架。
5、加载CEGUI编辑器产生的窗口
CEGUI::Window *guiRoot = CEGUI::WindowManager::getSingleton().loadWindowLayout("TextDemo.layout"); CEGUI::System::getSingleton().setGUISheet(guiRoot);6、手动创建CEGUI窗口对象//! 必须使用框架提供的管理器,窗口必须作为sheet的子窗口出现CEGUI::WindowManager &wmgr = CEGUI::WindowManager::getSingleton(); CEGUI::Window *sheet = wmgr.createWindow("DefaultWindow", "CEGUIDemo/Sheet");//! 创建一个窗口,此时并未接入sheet作为子窗口,所以并未展现CEGUI::Window *quit = wmgr.createWindow("TaharezLook/Button", "CEGUIDemo/QuitButton"); quit->setText("Quit"); quit->setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));//! 窗口加入sheet以便展现sheet->addChildWindow(quit); CEGUI::System::getSingleton().setGUISheet(sheet);//! 以上创建的是一个按钮,名字为“Quit”,为了响应按钮按下消息,需要在框架中注册监听消息,链接监听回调quit->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicTutorial7::quit, this));
6、渲染到纹理、画中画效果。
//! 创建自定义纹理对象
Ogre::TexturePtr tex = mRoot->getTextureManager()->createManual( "RTT", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 512, 512, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET); Ogre::RenderTexture *rtex = tex->getBuffer()->getRenderTarget();//! 创建一个新的照相机和视口,记得关闭视口的一些特性例如Overlays,否则我们创建的CEGUI窗口和OGRE会出现重叠Ogre::Camera *cam = mSceneMgr->createCamera("RTTCam"); cam->setPosition(100, -100, -400); cam->lookAt(0, 0, -300); Ogre::Viewport *v = rtex->addViewport(cam); v->setOverlaysEnabled(false); v->setClearEveryFrame(true); v->setBackgroundColour(Ogre::ColourValue::Black);//! 从CEGUI引导对象创建CEGUI纹理//! mRenderer(类型为CEGUI::OgreRenderer*)正是第一部创建的CEGUI引导对象,CEGUI::Texture &guiTex = mRenderer->createTexture(tex);//! 创建CEGUI图像对象集。注意:与CEGUI窗口对象需要在窗口对象集(sheet)的管理下使用类似,图像对象也需要在图像对象集的管理下使用CEGUI::Imageset &imageSet = CEGUI::ImagesetManager::getSingleton().create("RTTImageset", guiTex); imageSet.defineImage("RTTImage", CEGUI::Point(0.0f, 0.0f), CEGUI::Size(guiTex.getSize().d_width, guiTex.getSize().d_height), CEGUI::Point(0.0f, 0.0f));//! 创建CEGUI窗口,之前已经介绍过,这里和它没有区别CEGUI::Window *si = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/StaticImage", "RTTWindow"); si->setSize(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0.4f, 0))); si->setPosition(CEGUI::UVector2(CEGUI::UDim(0.5f, 0), CEGUI::UDim(0.0f, 0)));//! 指定窗口中展现的图片,取得图像对象依然必须经过图像集对象si->setProperty("Image", CEGUI::PropertyHelper::imageToString(&imageSet.getImage("RTTImage")));
//! 将窗口加入窗口集(sheet),前面已经介绍过
sheet->addChildWindow(si);
最新修改:
http://www.cppblog.com/flyindark/archive/2011/06/13/148586.html