Code & Comments For Basic Tutorial 6 in Ogre3d Wiki

 Copyright © MikeFeng  QQ: 76848502

Basic Tutorial 5在官方wiki上有完整的源代码,参见这里

本文的代码来自于Ogre官方网站wiki的基础教程6, 这个代码使用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;
       }
 
};
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值