Ogre里使用CEGUI做的界面

最近几天把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  
014CEGUI::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  
029class GuiFrameListener:public ExampleFrameListener,public OIS::MouseListener,public OIS::KeyListener
030{
031private:
032    CEGUI::Renderer *mGUIRenderer;
033    bool mShoutdownRequested;
034public:
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  
110class TutorialApplication:public ExampleApplication
111{
112public:
113    CEGUI::OgreRenderer* mGUIRenderer;
114    CEGUI::Window* mEditorGuiSheet;
115  
116public:
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  
130protected:
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"
172INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
173#else
174int 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值