mGUIRenderer = 0; } }
下面是你可以设置任意Ogre场景的地方,使用你在前五章教程学到的方法。在这个Ogre场景中,你仍要为其添加一个独立的相机(camera)和视窗(viewport)。 protected:
void createScene(void) {
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5)); 下面是创建CEGUI日志的地方,一般都设置为Informative模式的。其具有四种模式:Standard, Errors, Informative 和 Insane。 // Set up GUI system
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr); mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
创建一个新的CEGUI系统,使用“TaharezLook”来设置图(sheme)与鼠标指针,使用“BlueHighway-12”来设置字体。
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)\
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)\zLook\
CEGUI::MouseCursor::getSingleton().setImage(\\
mGUISystem->setDefaultFont((CEGUI::utf8*)\2\
mEditorGuiSheet=CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)\
(CEGUI::utf8*)\ mGUISystem->setGUISheet(mEditorGuiSheet); }
调用自定义的帧监听器,这样我们可以在需要时访问“mGUIRender”。 void createFrameListener(void) {
mFrameListener = new GuiFrameListener(mWindow, mCamera, mGUIRenderer);
mRoot->addFrameListener(mFrameListener); } };
下面是主函数也是程序的主循环,在本教程并不需要你修改这段代码。
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include \
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else
int main(int argc, char **argv) #endif {
// Create application object TutorialApplication app; try { app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), \exception has occured!\MB_TASKMODAL); #else
fprintf(stderr, \occured: %s\\n\#endif
} return 0; }
完成后,编译程序能得到一个空的窗口。请关掉程序,继续我们的学习。注意:如果实际操作中出现问题,你可以在应用程序所在文件夹中找到“CEGUI.log”文件分析查找错误
CEGUI是如何工作的
本质上CEGUI是通过向窗口添加第二个场景,这个场景是在Ogre的基本渲染队列完成后才渲染的。这个场景仅仅是由一系列3D矩形对象组成的。(也就是两个多边形沿着其边压制到一起)。渲染矩阵是为消除矩形的突兀与歪斜而根据他们的位置建立的。使用这些矩形,添加材质和响应就构成了用户界面(GUI)。一般情况下这是很不错的,因为一个3D的用户界面将会自动的缩放其元素来适应屏幕,并且使用硬件材质过滤。其将会比C++标准的2D用户界面更加快速和漂亮。
“So in one sentence: CEGUI renders a 2D gui using 3D methods and hardware so you don't have to.”——zeroskill 添加退出按钮
首先,我们需要为应用程序添加下面的头文件。本例中是“Push Button”
#include
(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow
(\(CEGUI::utf8*)\
mEditorGuiSheet->addChildWindow(quitButton); quitButton->setPosition(CEGUI::Point(0.35f, 0.45f)); quitButton->setSize(CEGUI::Size(0.3f, 0.1f)); quitButton->setText(\
完成后执行程序,一个漂亮的按钮将会出现在屏幕中。但请注意,程序此时仍然不做任何事情,因为我们并没有为其添加响应时间。
如果你编译时遇到了setPosition()和setSize()的调用错误:
'CEGUI::Window::setPosition' : cannot convert parameter 1 from 'CEGUI::Vector2' to 'const CEGUI::UVector2 &' 将setPosition()和setSize()所在行分别用下面的代码替换:
quitButton->setPosition(CEGUI::UVector2(cegui_reldim(0.35f), cegui_reldim( 0.45f)) );