青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OGre實際應(yīng)用程序[五]譯

Posted on 2008-09-06 16:56 美洲豹 閱讀(245) 評論(0)  編輯 收藏 引用

更進一步

CEGUI

在這篇文章中,我們將把CEGUI集成到應(yīng)用程序中。

Rendering The UI

CEGUI 將它的 UI elements 畫成四方形的Mesh形式畫到"screen space". CEGUI 通過"OgreGUIRenderer"Ogre進行交互。

CEGUI Data Files

CEGUI中的文件有如下幾個:

  • Scheme. Definition of the different UI elements that are valid in a particular "scheme", for example buttons, listboxes, and so on. Found in .scheme files.
  • Look-And-Feel. Definition of the way that each UI element is presented on the display, including its behaviors and the textures used to render it. Found in .looknfeel files.
  • Layout. Defines the position, size, parenting hierarchy and other properties used to display actual UI elements in a single unit: the UI "sheet". Found in .layout files.
  • Imageset. Defines the textures used in a scheme, and the UV coordinates that are actually mapped to UI element quads on your screen. Found in .imageset files.
  • Font. Should be obvious; CEGUI needs to know where to find the fonts you intend to use for your text, including the glyph definitions and the font texture to use. Found in .font files.

In the gui.zip resource data file accompanying the source for this article, you will find many examples of all of these types of files. Look through each type of file and see what they contain -- they are all just text XML files. This article uses the "TaharezLookSkin" scheme.

Falagard Skinning System

There is also another part of CEGUI that works behind the scenes, but starting with CEGUI 0.5.x (the version used in this article), is core to its operation. The "Falagard" skinning system was devised as a way to remove the need to create a separate code module (DLL) that was used actually to assemble and render each different scheme and look-and-feel. As you might expect (if you are a regular in the Ogre forums) the person (at least mostly) responsible for its creation was Falagard (unless my information is incorrect, of course). This method of UI skinning is a generalized, data-driven way to render the UI elements without having to author special code to do it. It relies on all of that data found in the look-and-feel and scheme files for its operation -- verbosity of data is one of the prices you pay for flexibility. ;)

The Code

先介紹到這里,下面讓我們看一下代碼。在這個版本中,原來的初始版本將顯示我們這里創(chuàng)建的layout.

And Then, Now The Code

對于添加CEGUI需要的修改,會指出。首先在main.cpp添加附加的頭文件

// needed to be able to create the CEGUI renderer interface
#include "OgreCEGUIRenderer.h"
 
// CEGUI includes
#include "CEGUISystem.h"
#include "CEGUIInputEvent.h"
#include "CEGUIWindow.h"
#include "CEGUIWindowManager.h"
#include "CEGUISchemeManager.h"
#include "CEGUIFontManager.h"
#include "elements/CEGUIFrameWindow.h"

Initializing CEGUI

main.cpp

        // with a scene manager and window, we can create a the GUI renderer
        CEGUI::OgreCEGUIRenderer* pGUIRenderer = new CEGUI::OgreCEGUIRenderer(
               window,                               // the render window created earlier; CEGUI renders to this
               Ogre::RENDER_QUEUE_OVERLAY,           // CEGUI should render in this render queue
               false,                                // put everything in the above render queue first, not last
               3000,                                 // this is actually unnecessary now in CEGUI -- max quads for the UI
               sceneMgr                              // use this scene manager to manage the UI
        );
 
        // create the root CEGUI class
        CEGUI::System* pSystem = new CEGUI::System(pGUIRenderer);
 
        // tell us a lot about what is going on (see CEGUI.log in the working directory)
        CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
 
        // use this CEGUI scheme definition (see CEGUI docs for more)
        CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme", (CEGUI::utf8*)"GUI");
 
        // show the CEGUI mouse cursor (defined in the look-n-feel)
        pSystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
 
        // use this font for text in the UI
        CEGUI::FontManager::getSingleton().createFont("Tahoma-8.font", (CEGUI::utf8*)"GUI");
        pSystem->setDefaultFont((CEGUI::utf8*)"Tahoma-8");
 
        // load a layout from the XML layout file (you'll find this in resources/gui.zip), and 
        // put it in the GUI resource group
        CEGUI::Window* pLayout = CEGUI::WindowManager::getSingleton().loadWindowLayout("katana.layout", "", "GUI");
 
        // you need to tell CEGUI which layout to display. You can call this at any time to change the layout to
        // another loaded layout (i.e. moving from screen to screen or to load your HUD layout). Note that this takes
        // a CEGUI::Window instance -- you can use anything (any widget) that serves as a root window.
        pSystem->setGUISheet(pLayout);

Input Support For CEGUI

需要修改 InputHandler類以處理一個新增的參數(shù):一個指向main.cpp中創(chuàng)建的CEGUI::System的指針:

input.cpp

// MouseListener
bool InputHandler::mouseMoved(const OIS::MouseEvent &evt) {
        m_pSystem->injectMouseWheelChange(evt.state.Z.rel);
        return m_pSystem->injectMouseMove(evt.state.X.rel, evt.state.Y.rel);
}
 
bool InputHandler::mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID btn) {
        CEGUI::MouseButton button = CEGUI::NoButton;
        if (btn == OIS::MB_Left)
               button = CEGUI::LeftButton;
        if (btn == OIS::MB_Middle)
               button = CEGUI::MiddleButton;
        if (btn == OIS::MB_Right)
               button = CEGUI::RightButton;
        return m_pSystem->injectMouseButtonDown(button);
}
 
bool InputHandler::mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID btn) {
        CEGUI::MouseButton button = CEGUI::NoButton;
        if (btn == OIS::MB_Left)
               button = CEGUI::LeftButton;    
        if (btn == OIS::MB_Middle)
               button = CEGUI::MiddleButton;  
        if (btn == OIS::MB_Right)
               button = CEGUI::RightButton;   
        return m_pSystem->injectMouseButtonUp(button);
}
 
               
// KeyListener
bool InputHandler::keyPressed(const OIS::KeyEvent &evt) {
        unsigned int ch = evt.text;
        m_pSystem->injectKeyDown(evt.key);
        return m_pSystem->injectChar(ch);
}
 
bool InputHandler::keyReleased(const OIS::KeyEvent &evt) {
        if (evt.key == OIS::KC_ESCAPE)
               m_simulation->requestStateChange(SHUTDOWN);
        return m_pSystem->injectKeyUp(evt.key);
}
 

很顯然的,輸入系統(tǒng)通過inject…等命令,將自己掛進CEGUI.

main.cpp

        // since the input handler deals with pushing input to CEGUI, we need to give it a pointer
        // to the CEGUI System instance to use
        InputHandler *handler = new InputHandler(pSystem, sim, hWnd);
 
        // put us into our "main menu" state
        sim->requestStateChange(GUI);

同時,需要將狀態(tài)轉(zhuǎn)成GUI,如前面所述。在一個正常的應(yīng)用程序中,你通常是先進入“主菜單”,而不是直接進入游戲。你還需要建立一個類來處理UI的動作,為簡單起見,我們在main.cpp來處理:

        // make an instance of our GUI sheet handler class
        MainMenuDlg* pDlg = new MainMenuDlg(pSystem, pLayout, sim);

其定義見文件MainMenuDlg.h and .cpp:

MainMenuDlg.h

#pragma once
 
#include "CEGUIWindow.h"
 
namespace CEGUI
{
        class System;
        class Window;
}
 
class Simulation;
 
class MainMenuDlg
{
public:
        MainMenuDlg(CEGUI::System* pSystem, CEGUI::Window* pSheet, Simulation* pSimulation);
        ~MainMenuDlg();
 
        // CEGUI event handlers. You can name these whatever you like, so long as they have the proper 
        // signature: bool <method name>(const CEGUI::EventArgs &args)
        bool Quit_OnClick(const CEGUI::EventArgs &args);
        bool Options_OnClick(const CEGUI::EventArgs &args);
        bool Launch_OnClick(const CEGUI::EventArgs &args);
 
private:
        CEGUI::System* m_pSystem;      // pointer to the CEGUI System instance
        CEGUI::Window* m_pWindow;      // pointer to the layout sheet window
        Simulation* m_pSimulation;     // pointer to the Simulation controller 
};

MainMenuDlg.cpp

#include "MainMenuDlg.h"
#include "Simulation.h"
#include "CEGUISystem.h"
#include "CEGUIWindow.h"
#include "CEGUIWindowManager.h"
#include "elements/CEGUIPushButton.h"
 
MainMenuDlg::MainMenuDlg(CEGUI::System *pSystem, CEGUI::Window *pSheet, Simulation *pSimulation)
{
        m_pSystem = pSystem;
        m_pWindow = pSheet;
        m_pSimulation = pSimulation;
 
        // hook up the event handlers to the window elements
        CEGUI::PushButton* pQuitButton = (CEGUI::PushButton *)CEGUI::WindowManager::getSingleton().getWindow("cmdQuit");
        pQuitButton->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&MainMenuDlg::Quit_OnClick, this));
 
        CEGUI::PushButton* pOptionsButton = (CEGUI::PushButton *)CEGUI::WindowManager::getSingleton().getWindow("cmdOptions");
        pOptionsButton->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&MainMenuDlg::Options_OnClick, this));
 
        CEGUI::PushButton* pLaunchButton = (CEGUI::PushButton *)CEGUI::WindowManager::getSingleton().getWindow("cmdInstantAction");
        pLaunchButton->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&MainMenuDlg::Launch_OnClick, this));
}
 
MainMenuDlg::~MainMenuDlg()
{
}
 
bool MainMenuDlg::Quit_OnClick(const CEGUI::EventArgs &args)
{
        m_pSimulation->requestStateChange(SHUTDOWN);
        return true;
}
 
bool MainMenuDlg::Launch_OnClick(const CEGUI::EventArgs &args)
{
        return true;
}
 
bool MainMenuDlg::Options_OnClick(const CEGUI::EventArgs &args)
{
        return true;
}

兩個主要的事情是 (a) action handler methods 如何掛接 CEGUI events, and (b) “Quit”按鈕告訴程序狀態(tài)轉(zhuǎn)換到Shutdown.

Conclusion

Enjoy!

Link:  OIS: http://sourceforge.net/projects/wgois      


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


posts - 15, comments - 2, trackbacks - 0, articles - 29

Copyright © 美洲豹

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99视频超级精品| 亚洲精品中文字幕在线| 欧美在线www| 国内外成人免费激情在线视频| 午夜精品久久久久久久白皮肤| 亚洲一区二区三区四区五区黄 | 亚洲国产日韩欧美在线图片| 久热精品在线| 亚洲视频一二| 欧美一区二区视频在线观看2020| 激情欧美丁香| 一本大道久久a久久精品综合 | 欧美成人在线免费观看| 夜夜精品视频| 国产精品中文字幕在线观看| 免费成人高清视频| 欧美天天综合网| 噜噜噜91成人网| 国产精品九九| 欧美激情精品久久久久久| 欧美午夜影院| 欧美高清在线观看| 国产伦精品免费视频| 欧美福利小视频| 国产日韩欧美在线看| 亚洲电影在线免费观看| 国产精品系列在线| 亚洲国产精品t66y| 国产一区二区三区网站| 日韩一级欧洲| 亚洲激情网站| 欧美主播一区二区三区| 亚洲伊人久久综合| 欧美成人伊人久久综合网| 久久久国产一区二区三区| 欧美日韩国产丝袜另类| 夜夜嗨av色一区二区不卡| 久久国产99| 欧美在线影院| 国产精品久久久久久久9999 | 欧美电影免费观看| 国产亚洲精品久| 亚洲视频二区| 国产精品视区| 日韩西西人体444www| 亚洲国产精品成人va在线观看| 亚洲男同1069视频| 亚洲专区欧美专区| 国产精品盗摄一区二区三区| 亚洲国产影院| 亚洲片国产一区一级在线观看| 欧美自拍偷拍| 久久视频一区| 国产资源精品在线观看| 性做久久久久久久久| 欧美亚洲网站| 国产精品乱码人人做人人爱| 日韩视频免费在线观看| 在线性视频日韩欧美| 欧美日韩国产成人在线观看| 午夜久久美女| 欧美日韩中文在线| 韩国三级电影一区二区| 亚洲一区二区三区四区在线观看| 亚洲美女免费精品视频在线观看| 最新亚洲电影| 欧美福利视频在线| 亚洲激情第一页| 亚洲免费av电影| 欧美日韩国产成人精品| av成人免费在线| 亚洲欧美日韩国产综合在线 | 久久爱91午夜羞羞| 国产有码一区二区| 久久亚洲影院| 亚洲精品在线免费观看视频| 亚洲丝袜av一区| 国产日韩一区二区三区在线播放| 久久精品1区| 亚洲国产一区二区精品专区| 一区二区三区精密机械公司| 国产精品乱码| 久久在线视频| 日韩一区二区精品视频| 久久久久久亚洲综合影院红桃| 亚洲国产成人精品女人久久久 | 亚洲人成网在线播放| 欧美午夜激情视频| 久久成人精品| 日韩一区二区精品在线观看| 久久成人精品一区二区三区| 亚洲国产一区二区视频| 欧美色网在线| 久久综合99re88久久爱| 99日韩精品| 欧美a一区二区| 国产亚洲欧洲997久久综合| 久久尤物视频| 亚洲一区二区三区免费视频| 你懂的国产精品永久在线| 亚洲一区二区三区四区五区黄| 国产一区二区三区直播精品电影| 欧美电影在线免费观看网站| 亚洲欧美日韩国产中文| 亚洲国产黄色| 久久久久亚洲综合| 亚洲欧洲99久久| 日韩视频第一页| 激情懂色av一区av二区av| 欧美日韩视频在线| 麻豆久久婷婷| 久久av免费一区| 亚洲一区二区精品在线观看| 欧美激情第8页| 久久久久久久久久码影片| 亚洲一区二区三区成人在线视频精品| 欲香欲色天天天综合和网| 国产精品入口| 欧美视频中文字幕在线| 欧美国产日韩一区二区| 久久久精品国产一区二区三区| 亚洲视频在线播放| 欧美一区二粉嫩精品国产一线天| 91久久午夜| 亚洲国产精品视频一区| 一区二区视频欧美| 韩日精品在线| 激情成人在线视频| 国产一区在线播放| 国产欧美一区二区精品忘忧草| 欧美视频在线观看免费| 欧美人与性动交cc0o| 欧美国产日韩视频| 男人的天堂亚洲| 蜜臀久久久99精品久久久久久| 久久久av网站| 久热精品视频在线观看一区| 久久综合色8888| 欧美**字幕| 欧美高清一区二区| 欧美另类综合| 欧美午夜寂寞影院| 国产精品国产a| 国产精品久久久久999| 国产精品美女主播在线观看纯欲| 欧美三级视频在线播放| 欧美午夜女人视频在线| 国产精品一区在线观看| 国产伦精品一区二区三区照片91| 国产精品一区二区三区成人| 国产偷国产偷精品高清尤物| 国产综合色产| 91久久精品日日躁夜夜躁欧美 | 欧美呦呦网站| 久久香蕉国产线看观看av| 免费人成精品欧美精品| 亚洲高清精品中出| 日韩网站在线观看| 亚洲欧美激情诱惑| 久久久久国产一区二区三区| 欧美14一18处毛片| 欧美性猛片xxxx免费看久爱| 国产女优一区| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲精品色图| 欧美一区二区视频97| 免费亚洲电影在线| 亚洲美女91| 欧美在线免费播放| 欧美久久一级| 国产亚洲欧美日韩在线一区| 亚洲福利在线观看| 亚洲一区二区视频在线| 久久久国产成人精品| 91久久精品国产91性色| 午夜视频一区在线观看| 欧美aⅴ99久久黑人专区| 国产精品久久久久久久久久久久久久| 国产一区91精品张津瑜| 一本大道久久a久久精品综合| 欧美影院视频| 日韩视频免费观看| 久久男女视频| 国产精品日韩一区二区三区| 亚洲日本久久| 久久午夜精品一区二区| 亚洲最新在线视频| 免费久久久一本精品久久区| 国产精品日本精品| 99亚洲精品| 免费视频一区二区三区在线观看| 亚洲视频自拍偷拍| 欧美另类99xxxxx| 在线观看日韩www视频免费| 欧美一级视频| 艳女tv在线观看国产一区| 麻豆成人在线播放| 精品成人a区在线观看| 性伦欧美刺激片在线观看| 亚洲免费福利视频|