现在的位置: 首页 > 综合 > 正文

Ogre里使用CEGUI做的界面

2013年10月02日 ⁄ 综合 ⁄ 共 6222字 ⁄ 字号 评论关闭

最近几天把CELayouteditor编译了,也按照日志“Ogre1.7.1下使用CEGUI0.7.1”里把CEGUI和OGRE重新配置了一番,并且终于看完了OgreCN上的基础教程,还提取了天龙八部2里的所有资源,哈哈,感觉收获颇多。

中文Ogre wiki上的教程已经有些老了,从基础教程6开始就代码不能正常跑了。这里贴下能正常运行的代码,复制就OK了。关于教程结尾那个两个界面间的切换,我捣鼓了一阵子,差不多弄出个样子,但效果还是很差,啥透明都没,所以代码就不贴了。

001 #include
002 #include
003 #include
004 #include
005 #include
006 #include
007 #include
008 #include
009 #include
010 #include
011 //regular mem handler
012 #include "ExampleApplication.h"
013   
014 CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
015 {
016     switch (buttonID)
017     {
018     case OIS::MB_Left:
019         return CEGUI::LeftButton;
020     case OIS::MB_Right:
021         return CEGUI::RightButton;
022     case OIS::MB_Middle:
023         return CEGUI::MiddleButton;
024     default:
025         return CEGUI::LeftButton;
026     }
027 }
028   
029 class GuiFrameListener:public ExampleFrameListener,public OIS::MouseListener,public OIS::KeyListener
030 {
031 private:
032     CEGUI::Renderer *mGUIRenderer;
033     bool mShoutdownRequested;
034 public:
035     GuiFrameListener(RenderWindow* win,Camera* cam,CEGUI::Renderer* renderer)
036         :ExampleFrameListener(win,cam,true,true),mGUIRenderer(renderer)
037         ,mShoutdownRequested(false)
038     {
039         mMouse->setEventCallback(this);
040         mKeyboard->setEventCallback(this);
041   
042         CEGUI::WindowManager* wmgr=CEGUI::WindowManager::getSingletonPtr();
043         CEGUI::Window* quitBtn=wmgr->getWindow((CEGUI::utf8*)"Quit");
044         quitBtn->subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&GuiFrameListener::quit,this));
045     }
046   
047     bool quit(const CEGUI::EventArgs &evt)
048     {
049         mShoutdownRequested=true;
050         return true;
051     }
052   
053     bool frameStarted(const FrameEvent& evt)
054     {
055         if(mMouse)
056             mMouse->capture();
057         if(mKeyboard)
058             mKeyboard->capture();
059   
060         return ExampleFrameListener::frameStarted(evt);
061     }
062   
063     bool frameEnded(const FrameEvent& evt)
064     {
065         if(mShoutdownRequested)
066             return false;
067         else
068             return ExampleFrameListener::frameEnded(evt);
069     }
070   
071     bool mouseMoved(const OIS::MouseEvent &evt)
072     {
073         CEGUI::System::getSingleton().injectMouseMove(evt.state.X.rel,evt.state.Y.rel);
074         return true;
075     }
076   
077     bool mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID id)
078     {
079         CEGUI::System::getSingleton().injectMouseButtonDown(convertOgreButtonToCegui(id));
080         return true;
081     }
082   
083     bool mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID id )
084     {
085         CEGUI::System::getSingleton().injectMouseButtonUp(convertOgreButtonToCegui(id));
086         return true;
087     }
088   
089     bool keyPressed(const OIS::KeyEvent &evt )
090     {
091         if(evt.key==OIS::KC_ESCAPE)
092         {
093             mShoutdownRequested=true;
094             return true;
095         }
096   
097         CEGUI::System::getSingleton().injectKeyDown(evt.key);
098   
099         CEGUI::System::getSingleton().injectChar(evt.text);
100         return true;
101     }
102   
103     bool keyReleased(const OIS::KeyEvent &evt )
104     {
105         CEGUI::System::getSingleton().injectKeyUp(evt.key);
106         return true;
107     }
108 };
109   
110 class TutorialApplication:public ExampleApplication
111 {
112 public:
113     CEGUI::OgreRenderer* mGUIRenderer;
114     CEGUI::Window* mEditorGuiSheet;
115   
116 public:
117     TutorialApplication()
118         :mGUIRenderer(NULL),mEditorGuiSheet(NULL)
119     {
120     }
121   
122     ~TutorialApplication()
123     {
124         /**//*if(mEditorGuiSheet)
125             {
126             CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
127             }*/
128     }
129   
130 protected:
131     void createScene(void)
132     {
133         mGUIRenderer=&CEGUI::OgreRenderer::bootstrapSystem();
134   
135         //LOG
136         CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::LoggingLevel::Informative);
137   
138         //GUI
139         CEGUI::SchemeManager::getSingleton().create("TaharezLook.scheme");
140         CEGUI::System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow");
141         CEGUI::MouseCursor::getSingleton().setImage("TaharezLook","MouseMoveCursor");
142         CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");
143         mEditorGuiSheet=(CEGUI::Window*)CEGUI::WindowManager::getSingleton().createWindow("DefaultWindow","Sheet");
144         CEGUI::System::getSingleton().setGUISheet(mEditorGuiSheet);
145   
146         //Button
147         CEGUI::PushButton* quitBtn=(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button",(CEGUI::utf8*)"Quit");
148         quitBtn->setPosition(CEGUI::UVector2(cegui_reldim(.35f), cegui_reldim(.45f)));
149         quitBtn->setSize(CEGUI::UVector2(cegui_reldim(.15f), cegui_reldim(.05f)));
150         quitBtn->setText((CEGUI::utf8*)"OK");
151         mEditorGuiSheet->addChildWindow(quitBtn);
152   
153         //Load Layout
154         //mEditorGuiSheet = CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)"Tutorial Gui.xml");
155         //CEGUI::System::getSingleton().setGUISheet(mEditorGuiSheet);
156         //CEGUI::PushButton* quitButton=(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().getWindow((CEGUI::utf8*)"Quit");
157   
158         mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
159         mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
160     }
161   
162     void createFrameListener(void)
163     {
164         mFrameListener = new GuiFrameListener(mWindow, mCamera, mGUIRenderer);
165         mRoot->addFrameListener(mFrameListener);
166     }
167 };
168   
169 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
170 #define WIN32_LEAN_AND_MEAN
171 #include "windows.h"
172 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
173 #else
174 int main(int argc, char **argv)
175 #endif
176 {
177     // Create application object
178     TutorialApplication app;
179     try {
180         app.go();
181     } catch( Exception& e ) {
182 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
183         MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
184 #else
185         fprintf(stderr, "An exception has occured: %s/n",e.getFullDescription().c_str());
186 #endif
187     }
188   
189     return 0;
190 }

 

 

原文地址:http://www.beyondc.cn/ogre-in-the-interface-using-cegui-do.html

抱歉!评论已关闭.