结合使用Ogre 1.7.1 +CEGUI 0.7.1

  • 这篇文章是对于Ogre3D中文网——基础教程六的补充,阅读前假定你已经对于Ogre和CEGUI有一定了解,并且阅读了《基础教程六》

    如果你还不了解他们,你应该知道:
    Ogre是一个3D图形渲染引擎;CEGUI是灵活的,可自由定义样式的GUI框架,他可以很好的支持Ogre,来绘制界面。

    如果你对于Ogre和CEGUI感兴趣,以下将是很好的学习资源:
    Ogre:http://www.ogre3d.org/
    Ogre3D中文网:http://wiki.ogre3d.cn/wiki/
    CEGUI:http://www.cegui.org.uk/

    如果你和我一样也是从Ogre1.7开始接触这个食人魔,你也一定在学习的过程中遇到了很多麻烦,官方的入门教程还多数停留在Ogre 1.4的时代,面对这个更新如此频繁的怪物,很多守旧的东西早已不适用,如果你还在挖空心思想要了解这些经历了版本变迁过时的东西,如何能够应用到新的Ogre1.7+CEGUI0.7中,这篇文章或许对你会有帮助:D。另外,Ogre于4月28号刚刚更新到1.7.1,修正了1.7.0的诸多问题,继续学习前建议你更新到此版本。

    结合使用Ogre1.7+CEGUI0.7,需要注意的问题:
    1、你可能还在学习官方的Ogre1.4版本的教程,你会发现MouseMotionListener、MouseListener这些由Ogre自己实现的输入设备功能类早已被取消掉,原1.4版本的InputReader已由InputManager替代,键/鼠/手柄设备的输入功能可以由OIS来实现(这并非唯一途径,但,是官方极力推荐的),创建设备对象可以通过

  1. mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, true));  
  2. mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, true));  
  3. mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject(OIS::OISJoyStick, true));  
  • 使用CEGUI时,还需通过System向CEGUI注入OIS事件对象,如:

  1. CEGUI::System::getSingleton().injectMouseButtonDown(convertOgreButtonToCegui(id));  

  • 2、CEGUI0.7版本之前的Ogre渲染器CEGUI::OgreCEGUIRenderer已由CEGUI::OgreRender替代,并且创建Renderer和System的步骤已经被简化,原来的

  1. mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000,mSceneMgr);  
  2. mGUISystem = new CEGUI::System(mGUIRenderer);  

  • 现在可以简化为:

  1. mGUIRenderer=&CEGUI::OgreRenderer::bootstrapSystem();  

  • 下面对于基础教程六的代码进行新版改造:
    下面的场景中创建了一个简单的天空穹,用CEGUI绘制了一个按钮,点击按钮OK后退出应用程序
    注意:为了能让Ogre找到CEGUI的相关素材资源,你需要将Ogre的resource.cfg资源文件中的CEGUI资源文件路径做相关添加
    全部代码如下:

  1.  #include <CEGUIImageset.h>  
  2.  #include <CEGUISystem.h>  
  3.  #include <CEGUILogger.h>  
  4.  #include <CEGUISchemeManager.h>  
  5.  #include <CEGUIWindowManager.h>  
  6.  #include <CEGUIWindow.h>  
  7.  #include <elements/CEGUIPushButton.h>  
  8.  #include <RendererModules/Ogre/CEGUIOgreRenderer.h>  
  9.  #include <RendererModules/Ogre/CEGUIOgreResourceProvider.h>  
  10.  #include <RendererModules/Ogre/CEGUIOgreGeometryBuffer.h>  
  11.  //regular mem handler  
  12.  #include "ExampleApplication.h"  
  13.    
  14.  CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)  
  15.  {  
  16.      switch (buttonID)  
  17.      {  
  18.      case OIS::MB_Left:  
  19.          return CEGUI::LeftButton;  
  20.      case OIS::MB_Right:  
  21.          return CEGUI::RightButton;  
  22.      case OIS::MB_Middle:  
  23.          return CEGUI::MiddleButton;  
  24.      default:  
  25.          return CEGUI::LeftButton;  
  26.      }  
  27.  }  
  28.    
  29.  class GuiFrameListener:public ExampleFrameListener,public OIS::MouseListener,public OIS::KeyListener  
  30.  {  
  31.  private:  
  32.      CEGUI::Renderer *mGUIRenderer;  
  33.      bool mShoutdownRequested;  
  34.  public:  
  35.      GuiFrameListener(RenderWindow* win,Camera* cam,CEGUI::Renderer* renderer)  
  36.          :ExampleFrameListener(win,cam,true,true),mGUIRenderer(renderer),mShoutdownRequested(false)  
  37.      {  
  38.          mMouse->setEventCallback(this);  
  39.          mKeyboard->setEventCallback(this);  
  40.    
  41.          CEGUI::WindowManager* wmgr=CEGUI::WindowManager::getSingletonPtr();  
  42.          CEGUI::Window* quitBtn=wmgr->getWindow((CEGUI::utf8*)"Quit");  
  43.          quitBtn->subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&GuiFrameListener::quit,this));  
  44.      }  
  45.    
  46.      void requestShoutdown()  
  47.      {  
  48.          mShoutdownRequested=true;  
  49.      }  
  50.    
  51.      bool quit(const CEGUI::EventArgs &evt)  
  52.      {  
  53.          mShoutdownRequested=true;  
  54.          return true;  
  55.      }  
  56.    
  57.      bool frameStarted(const FrameEvent& evt)  
  58.      {  
  59.          if(mMouse)  
  60.              mMouse->capture();  
  61.          if(mKeyboard)   
  62.              mKeyboard->capture();  
  63.    
  64.          return ExampleFrameListener::frameStarted(evt);  
  65.      }  
  66.    
  67.      bool frameEnded(const FrameEvent& evt)  
  68.      {  
  69.          if(mShoutdownRequested)  
  70.              return false;  
  71.          else  
  72.              return ExampleFrameListener::frameEnded(evt);  
  73.      }  
  74.    
  75.      bool mouseMoved(const OIS::MouseEvent &evt)  
  76.      {  
  77.          CEGUI::System::getSingleton().injectMouseMove(evt.state.X.rel,evt.state.Y.rel);  
  78.          return true;  
  79.      }  
  80.    
  81.      bool mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID id)   
  82.      {  
  83.          CEGUI::System::getSingleton().injectMouseButtonDown(convertOgreButtonToCegui(id));  
  84.          return true;  
  85.      }  
  86.    
  87.      bool mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID id )  
  88.      {  
  89.          CEGUI::System::getSingleton().injectMouseButtonUp(convertOgreButtonToCegui(id));  
  90.          return true;  
  91.      }  
  92.    
  93.      bool keyPressed(const OIS::KeyEvent &evt )  
  94.      {  
  95.          if(evt.key==OIS::KC_ESCAPE)  
  96.          {  
  97.              mShoutdownRequested=true;  
  98.              return true;  
  99.          }  
  100.   
  101.         CEGUI::System::getSingleton().injectKeyDown(evt.key);  
  102.         CEGUI::System::getSingleton().injectChar(evt.text);  
  103.   
  104.         return true;  
  105.     }  
  106.   
  107.     bool keyReleased(const OIS::KeyEvent &evt )  
  108.     {  
  109.         CEGUI::System::getSingleton().injectKeyUp(evt.key);  
  110.         return true;  
  111.     }  
  112. };<pre name="code" class="cpp">class TutorialApplication:public ExampleApplication  
  113. {  
  114. public:  
  115.     CEGUI::OgreRenderer* mGUIRenderer;  
  116.     CEGUI::Window* mEditorGuiSheet;  
  117.   
  118. public:  
  119.     TutorialApplication()  
  120.         :mGUIRenderer(NULL),mEditorGuiSheet(NULL)  
  121.     {  
  122.     }  
  123.   
  124.     ~TutorialApplication()  
  125.     {  
  126.         /**//*if(mEditorGuiSheet) 
  127.         { 
  128.             CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet); 
  129.         }*/  
  130.   
  131.   
  132.     }  
  133.   
  134. protected:  
  135.     void createScene(void)  
  136.     {  
  137.         mGUIRenderer=&CEGUI::OgreRenderer::bootstrapSystem();  
  138.   
  139.         //设置日志  
  140.         //Ogre::Log::setLogDetail(Ogre::LoggingLevel::LL_NORMAL);  
  141.         CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::LoggingLevel::Informative);  
  142.   
  143.         CEGUI::SchemeManager::getSingleton().create("TaharezLook.scheme");  
  144.         CEGUI::System::getSingleton().setDefaultMouseCursor("TaharezLook""MouseArrow");  
  145.         CEGUI::MouseCursor::getSingleton().setImage("TaharezLook","MouseMoveCursor");  
  146.         CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");  
  147.   
  148.         mEditorGuiSheet=(CEGUI::Window*)CEGUI::WindowManager::getSingleton().createWindow("DefaultWindow","Sheet");  
  149.         CEGUI::System::getSingleton().setGUISheet(mEditorGuiSheet);  
  150.           
  151.         CEGUI::PushButton* quitBtn=(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button",(CEGUI::utf8*)"Quit");  
  152.         quitBtn->setPosition(CEGUI::UVector2(cegui_reldim(.35f), cegui_reldim(.45f)));  
  153.         quitBtn->setSize(CEGUI::UVector2(cegui_reldim(.15f), cegui_reldim(.05f)));  
  154.         quitBtn->setText((CEGUI::utf8*)"OK");  
  155.         mEditorGuiSheet->addChildWindow(quitBtn);  
  156.   
  157.   
  158.         /**//* 
  159.         mEditorGuiSheet = CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)"Tutorial Gui.xml"); 
  160.         CEGUI::System::getSingleton().setGUISheet(mEditorGuiSheet); 
  161.         CEGUI::PushButton* quitButton=(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().getWindow((CEGUI::utf8*)"Quit"); 
  162.         */  
  163.   
  164.         mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));  
  165.         mSceneMgr->setSkyDome(true"Examples/CloudySky", 5, 8);  
  166.     }  
  167.   
  168.     void createFrameListener(void)  
  169.     {  
  170.         mFrameListener = new GuiFrameListener(mWindow, mCamera, mGUIRenderer);  
  171.         mRoot->addFrameListener(mFrameListener);  
  172.     }  
  173. };  
  174.   
  175. #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32  
  176. #define WIN32_LEAN_AND_MEAN  
  177. #include "windows.h"  
  178. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCELPSTR strCmdLine, INT )  
  179. #else  
  180. int main(int argc, char **argv)  
  181. #endif  
  182. {  
  183.     // Create application object  
  184.     TutorialApplication app;  
  185.     try {  
  186.         app.go();  
  187.     } catch( Exception& e ) {  
  188. #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32   
  189.         MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);  
  190. #else  
  191.         fprintf(stderr, "An exception has occured: %s\n",e.getFullDescription().c_str());  
  192. #endif  
  193.     }  
  194.   
  195.     return 0;  
  196. }</pre>  
  197. <pre></pre>  

  • 运行效果图如下:


    把这个例子跑通基础教程后面的部分就会很顺利了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值