1. 程式人生 > >Code & Comments For Basic Tutorial 6 in Ogre3d Wiki

Code & Comments For Basic Tutorial 6 in Ogre3d Wiki

 Copyright © MikeFeng  QQ: 76848502

Basic Tutorial 5在官方wiki上有完整的原始碼,參見這裡

本文的程式碼來自於, 這個程式碼使用Ogre自帶的Example框架, 主要實現了以下功能: 

  1. CEGUI在OGRE中的使用
  2. 處理滑鼠和鍵盤事件

效果圖如下:

下面是程式碼:

/* ----------------------------------------------------------------------------- This source file is part of OGRE     (Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/ Copyright (c) 2000-2006 Torus Knot Software Ltd Also see acknowledgements in Readme.html You may use this sample code for anything you like, it is not covered by the LGPL like the rest of the engine. -----------------------------------------------------------------------------
*/ /**     /file         demo.h     /brief         Specialisation of OGRE's framework application to show the         CEGUI rendering plugin */ //mem probs without this next one #include <OgreNoMemoryMacros.h> #include <CEGUI/CEGUIImageset.h> #include <CEGUI/CEGUISystem.h> #include <CEGUI/CEGUILogger.h>
#include <CEGUI/CEGUISchemeManager.h> #include <CEGUI/CEGUIWindowManager.h> #include <CEGUI/CEGUIWindow.h> #include <CEGUI/elements/CEGUIPushButton.h> #include "OgreCEGUIRenderer.h" #include "OgreCEGUIResourceProvider.h" //regular mem handler #include <OgreMemoryMacros.h> #include "ExampleApplication.h" class GuiFrameListener :    public ExampleFrameListener,                                                  public OIS::MouseListener,                                                  public OIS::KeyListener { private:        CEGUI::Renderer* mGUIRenderer;        bool mShutdownRequested; public:        // using buffered input        GuiFrameListener(RenderWindow* win, Camera* cam, CEGUI::Renderer* renderer)               : ExampleFrameListener(win, cam, true, true,true),                mGUIRenderer(renderer),                mShutdownRequested(false)        {               mMouse->setEventCallback(this);               mKeyboard->setEventCallback(this);        }        // Tell the frame listener to exit at the end of the next frame        void requestShutdown(void)        {               mShutdownRequested = true;        }        bool frameEnded(const FrameEvent &evt)        {               if (mShutdownRequested)                      return false;               else                      return ExampleFrameListener::frameEnded(evt);        }        bool mouseMoved( const OIS::MouseEvent &e)        {               using namespace OIS;               CEGUI::System::getSingleton().injectMouseMove(                      e.state.X.rel,e.state.Y.rel);               return true;        }        bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)        {               using namespace OIS;               CEGUI::System::getSingleton().injectMouseButtonDown(                      convertOgreButtonToCegui(id));               return true;        }        bool mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id )        {               CEGUI::System::getSingleton().injectMouseButtonUp(               convertOgreButtonToCegui(id));               return true;        }        bool keyPressed( const OIS::KeyEvent &e)        {               if(e.key == OIS::KC_ESCAPE)               {                      mShutdownRequested = true;                      return true;               }               CEGUI::System::getSingleton().injectKeyDown(e.key);               CEGUI::System::getSingleton().injectChar(e.text);               return true;        }        bool keyReleased( const OIS::KeyEvent &e )        {               CEGUI::System::getSingleton().injectKeyUp(e.key);               return true;        }        CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)        {               switch (buttonID)               {               case OIS::MB_Left:                      return CEGUI::LeftButton;               case OIS::MB_Right:                      return CEGUI::RightButton;               case OIS::MB_Middle:                      return CEGUI::MiddleButton;               //case MouseEvent::BUTTON3_MASK:               //     return CEGUI::X1Button;               default:                      return CEGUI::LeftButton;        } } }; class App : public ExampleApplication { private:        CEGUI::OgreCEGUIRenderer* mGUIRenderer;        CEGUI::System* mGUISystem;        CEGUI::Window* mEditorGuiSheet; public:        App() : mGUIRenderer(0),                      mGUISystem(0),                      mEditorGuiSheet(0)        {        }        ~App()        {               if (mEditorGuiSheet)               {                      CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);               }               if(mGUISystem)               {                      delete mGUISystem;                      mGUISystem = 0;               }               if(mGUIRenderer)               {                      delete mGUIRenderer;                      mGUIRenderer = 0;               }        } protected:     void createScene(void)     {               // Set ambient light               mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));               // 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);               // using the 'Taharez Look'               CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");               mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");               CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");               mGUISystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");               // Quit push button.               mEditorGuiSheet = CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)"Tutorial Gui.xml");               mGUISystem->setGUISheet(mEditorGuiSheet);               CEGUI::PushButton* quitButton = (CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().getWindow((CEGUI::utf8*)"Quit");               //mEditorGuiSheet = CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"DefaultWindow", (CEGUI::utf8*)"Sheet");                //mGUISystem->setGUISheet(mEditorGuiSheet);               //CEGUI::PushButton* quitButton = (CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Quit");               //mEditorGuiSheet->addChildWindow(quitButton);               //quitButton->setPosition(CEGUI::UVector2(cegui_reldim(0.35f), cegui_reldim( 0.45f)) );               //quitButton->setSize(CEGUI::UVector2(cegui_reldim(0.35f), cegui_reldim( 0.1f)) );               //quitButton->setText("Quit");               setupEventHandlers();     }        void createFrameListener(void)        {               mFrameListener = new GuiFrameListener(mWindow, mCamera, mGUIRenderer);               mRoot->addFrameListener(mFrameListener);        }        void setupEventHandlers(void)        {               CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();               wmgr.getWindow((CEGUI::utf8*)"Quit")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&App::handleQuit, this));        }        bool handleQuit(const CEGUI::EventArgs& e)        {               static_cast<GuiFrameListener*>(mFrameListener)->requestShutdown();               return true;        } };