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

OGre實際應用程序[五]譯

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

更進一步

CEGUI

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

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

先介紹到這里,下面讓我們看一下代碼。在這個版本中,原來的初始版本將顯示我們這里創建的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類以處理一個新增的參數:一個指向main.cpp中創建的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);
}
 

很顯然的,輸入系統通過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);

同時,需要將狀態轉成GUI,如前面所述。在一個正常的應用程序中,你通常是先進入“主菜單”,而不是直接進入游戲。你還需要建立一個類來處理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”按鈕告訴程序狀態轉換到Shutdown.

Conclusion

Enjoy!

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

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>
            亚洲视频欧美在线| 亚洲专区免费| 欧美日韩午夜在线| 亚洲欧美欧美一区二区三区| 亚洲国产精品久久久久秋霞蜜臀| 你懂的国产精品| 国产精品久久久久久一区二区三区 | 日韩午夜激情电影| 免费看精品久久片| 亚洲欧美在线观看| 一区二区久久久久久| 韩日午夜在线资源一区二区| 欧美天堂亚洲电影院在线播放| 久久久精品tv| 欧美亚洲日本一区| 亚洲自拍偷拍网址| 久久久噜噜噜久噜久久 | 亚洲午夜电影| 美日韩精品免费观看视频| 久久精品国产一区二区三区| 国产精品第一区| 欧美国产日韩在线观看| 免费看av成人| 亚洲国产成人高清精品| 激情偷拍久久| 美女国产一区| 亚洲日本久久| 亚洲一区免费观看| 国产女人18毛片水18精品| 亚洲一区二区三区免费视频| 亚洲永久在线| 伊人久久大香线蕉综合热线 | 亚洲国产婷婷香蕉久久久久久| 性做久久久久久久久| 免费日韩成人| 午夜日韩在线观看| 在线成人h网| 欧美欧美天天天天操| 亚洲自拍偷拍一区| 欧美国产日本| 久久这里只有精品视频首页| 一本久久a久久免费精品不卡| 国产日韩欧美在线播放| 蜜乳av另类精品一区二区| 夜夜狂射影院欧美极品| 久久综合九色| 欧美专区一区二区三区| 亚洲综合丁香| 亚洲伦理在线观看| 亚洲国产精品成人综合色在线婷婷| 国产精品裸体一区二区三区| 最近中文字幕日韩精品| 久久久久久久一区| 亚洲欧美日韩第一区| 欧美日韩一区二区欧美激情| 亚洲国产日韩欧美在线99| 久久av免费一区| 亚洲免费在线视频一区 二区| 欧美国产精品v| 亚洲国产mv| 免费看黄裸体一级大秀欧美| 午夜精品电影| 国产在线播放一区二区三区| 久久精品女人| 欧美中文日韩| 国产一区二区三区观看 | 亚洲综合好骚| 国产综合av| 欧美国产视频在线| 欧美成熟视频| 亚洲午夜91| 欧美中文在线观看国产| 韩国成人福利片在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲欧美一区二区视频| 欧美一区二区三区另类| 国产日韩成人精品| 久色婷婷小香蕉久久| 欧美成年人视频网站| 久久成人免费日本黄色| 国内一区二区在线视频观看 | 91久久黄色| 午夜精品久久久久久久99樱桃| 欧美日韩国产免费| 久久手机免费观看| 欧美性猛交xxxx免费看久久久| 欧美在线免费| 欧美视频不卡| 模特精品裸拍一区| 国产日韩精品综合网站| 亚洲香蕉网站| 国产精品va在线播放我和闺蜜| 亚洲第一在线综合在线| 久久色中文字幕| 久久久综合激的五月天| 国产真实久久| 蜜臀va亚洲va欧美va天堂| 久久成人18免费观看| 黄色小说综合网站| 女仆av观看一区| 久久影视精品| 日韩亚洲欧美精品| 亚洲精品免费在线观看| 欧美日本视频在线| 午夜精品短视频| 久久国产精品99久久久久久老狼| 国产精品永久免费视频| 亚洲欧美第一页| 久久精品国产v日韩v亚洲| 尤物九九久久国产精品的特点| 久久久精品一区| 国产精品久久久999| 欧美在线亚洲| 免费在线亚洲| 亚洲欧美日韩国产综合在线| 亚洲欧美日韩国产中文在线| 在线不卡亚洲| 亚洲视频中文| 亚洲电影在线播放| 一区二区三区视频在线| 1000部国产精品成人观看| 亚洲欧洲日本在线| 国产亚洲视频在线观看| 亚洲日本va午夜在线电影| 好看不卡的中文字幕| 99国产精品国产精品久久| 狠狠色狠狠色综合日日tαg| 一本色道88久久加勒比精品| 亚洲精品欧洲| 欧美国产三级| 亚洲人成人77777线观看| 激情综合激情| 久久国产精品久久精品国产| 午夜在线视频一区二区区别| 欧美激情综合色综合啪啪| 免费不卡中文字幕视频| 国产亚洲在线| 久久久久久久久久久久久女国产乱 | 欧美激情一区二区三区| 亚洲电影欧美电影有声小说| 黄色成人av网| 老牛嫩草一区二区三区日本| 久久99在线观看| 国产午夜精品久久久久久久| 中文国产一区| 久久免费精品视频| 亚洲高清在线精品| 欧美激情视频网站| 一区二区三区欧美在线| 亚洲先锋成人| 国产精品女人毛片| 欧美伊人久久| 亚洲激情视频网| 亚洲欧洲av一区二区| 国产日韩在线播放| 久久综合伊人77777| 亚洲国内高清视频| 久久成人免费视频| 一本大道久久a久久综合婷婷 | 美女在线一区二区| 欧美成人dvd在线视频| 亚洲第一视频| 中文亚洲视频在线| 久久久av毛片精品| 欧美护士18xxxxhd| 国产精品一二三| 亚洲黄色免费网站| 亚洲欧美制服中文字幕| 欧美 日韩 国产精品免费观看| 欧美国产日本韩| 亚洲女人天堂成人av在线| 久久久久久有精品国产| 欧美日韩精品一区| 亚洲高清一区二区三区| 亚洲制服少妇| 亚洲精品国产系列| 美女国内精品自产拍在线播放| 欧美日韩在线播放三区| 在线观看日韩精品| 久久国产欧美| 亚洲图片欧美日产| 欧美色图首页| 一本色道久久99精品综合| 欧美不卡视频| 久久性天堂网| 在线成人h网| 亚洲第一精品福利| 老司机免费视频一区二区| 在线观看一区| 能在线观看的日韩av| 久久久久国产精品一区三寸| 国产欧美日韩一区二区三区在线观看 | 日韩小视频在线观看专区| 在线一区观看| 麻豆国产精品va在线观看不卡| 欧美va天堂va视频va在线| 99riav国产精品| 国产乱码精品一区二区三区忘忧草| 欧美性视频网站| 99热这里只有成人精品国产|