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

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>
            最新高清无码专区| 亚洲欧洲日韩在线| 欧美在线视频播放| 亚洲在线观看免费视频| 亚洲一区免费观看| 欧美一区二区三区视频免费| 久久久久.com| 欧美成人伊人久久综合网| 欧美精品在欧美一区二区少妇| 欧美三级视频在线| 国产色视频一区| 在线观看日产精品| 夜夜嗨网站十八久久| 午夜激情综合网| 免费欧美电影| 一区二区三区|亚洲午夜| 欧美在线免费看| 欧美顶级艳妇交换群宴| 国产精品久久久久久久久久久久久| 国产日韩欧美黄色| 亚洲乱码国产乱码精品精天堂| 香蕉乱码成人久久天堂爱免费| 欧美成人综合一区| 亚洲欧美国产制服动漫| 蜜臀va亚洲va欧美va天堂| 国产精品家教| 亚洲精品五月天| 久久久久成人精品| 99re亚洲国产精品| 久久欧美中文字幕| 国产精品进线69影院| 亚洲国产精品毛片| 久久久91精品国产| 一区二区三区www| 欧美承认网站| 伊人久久男人天堂| 欧美一区二区三区四区在线观看| 亚洲国产精品t66y| 久久成人精品视频| 国产精品国产三级国产aⅴ浪潮| 亚洲国产欧美一区二区三区久久 | 亚洲精品视频一区| 欧美在线观看视频一区二区| 欧美日韩精品在线播放| 在线观看欧美成人| 欧美日韩一二三四五区| 国内精品国产成人| 亚洲欧美日韩高清| 亚洲精品影院在线观看| 另类综合日韩欧美亚洲| 国产在线不卡| 欧美在线视频观看| 午夜精品久久99蜜桃的功能介绍| 欧美日韩性生活视频| 亚洲精一区二区三区| 欧美黑人在线播放| 久久综合九色综合欧美就去吻| 国产综合婷婷| 久久综合给合久久狠狠色| 亚欧成人在线| 韩国欧美国产1区| 久久综合色一综合色88| 久久精品首页| …久久精品99久久香蕉国产| 美乳少妇欧美精品| 蜜桃av综合| 夜夜躁日日躁狠狠久久88av| 亚洲精品黄网在线观看| 欧美日韩精品久久久| 亚洲天堂av电影| 亚洲一二三区在线观看| 国产欧美91| 美女主播一区| 欧美精品电影| 亚洲欧美国产高清| 午夜久久久久| 亚洲国产精品一区制服丝袜| 亚洲精华国产欧美| 国产精品久久| 久久久夜精品| 欧美黄色片免费观看| 亚洲视频碰碰| 欧美一区二区视频在线观看2020| 黄色国产精品| 亚洲精品中文字幕在线| 国产欧美在线播放| 美女脱光内衣内裤视频久久影院| 欧美jizz19hd性欧美| 亚洲视频免费看| 欧美在线视频观看免费网站| 亚洲精品日韩欧美| 亚洲欧美一区二区三区极速播放 | 欧美日韩日本视频| 久久aⅴ乱码一区二区三区| 久久人人爽人人| 亚洲午夜在线视频| 久久久噜久噜久久综合| 一本一本久久| 欧美主播一区二区三区| 一本久久精品一区二区| 久久www成人_看片免费不卡| 日韩视频免费在线观看| 欧美一区二区三区免费视频| 99精品视频免费全部在线| 欧美一区二区精品久久911| 亚洲裸体在线观看| 久久精品国产清高在天天线| 久久亚洲春色中文字幕| 99精品国产在热久久| 欧美伊久线香蕉线新在线| 妖精成人www高清在线观看| 久久激情综合网| 亚洲欧美日本国产有色| 欧美精品在线免费观看| 免费成人性网站| 国产亚洲免费的视频看| 在线一区二区三区四区| 亚洲精品午夜精品| 久久久久久亚洲精品杨幂换脸| 香蕉av777xxx色综合一区| 欧美日韩精品在线播放| 欧美激情中文字幕乱码免费| 国内偷自视频区视频综合| 亚洲一区二区精品| 亚洲综合首页| 欧美视频官网| 亚洲看片网站| 日韩天堂在线视频| 欧美激情91| 亚洲国产日韩一级| 亚洲激情电影中文字幕| 麻豆久久久9性大片| 欧美成人一区二区三区片免费| 黄色免费成人| 久久久国产精品一区| 久久久免费观看视频| 国产亚洲欧洲997久久综合| 欧美一级欧美一级在线播放| 亚洲欧美一区二区三区久久| 国产精品爽爽爽| 欧美亚洲自偷自偷| 久热re这里精品视频在线6| 一色屋精品视频免费看| 麻豆av一区二区三区| 亚洲第一中文字幕| 一本大道久久精品懂色aⅴ| 欧美色图一区二区三区| 99热在这里有精品免费| 午夜精品久久久久久久99樱桃 | 亚洲天堂av在线免费观看| 欧美日韩在线观看一区二区| 在线视频精品一| 欧美一区二区精品| 好看的av在线不卡观看| 玖玖综合伊人| 亚洲精品资源| 久久av红桃一区二区小说| 国一区二区在线观看| 另类人畜视频在线| 一区二区三区视频观看| 久久久久久久久久久一区| 亚洲国产欧洲综合997久久| 欧美日韩精品免费看 | 欧美日韩一级大片网址| 亚洲无线视频| 麻豆精品传媒视频| 亚洲视频一二| 伊人久久久大香线蕉综合直播| 美女视频网站黄色亚洲| 一本高清dvd不卡在线观看| 久久爱www久久做| 亚洲乱码国产乱码精品精天堂 | 欧美精品一区二区在线播放| 99成人在线| 久久久91精品| 99天天综合性| 国产一区二区三区高清| 欧美日韩国产综合一区二区| 欧美一区二区三区的| 亚洲精品中文字幕女同| 噜噜噜在线观看免费视频日韩| 亚洲深夜影院| 亚洲激情视频网站| 国产手机视频精品| 欧美日韩视频免费播放| 麻豆国产精品一区二区三区 | 欧美一区二区三区的| 亚洲精品一区二区三区蜜桃久| 国产酒店精品激情| 欧美日韩精品不卡| 六月婷婷一区| 欧美中文字幕不卡| 亚洲图片激情小说| 亚洲人成网站999久久久综合| 久久久久久综合| 午夜精品久久久久久| 亚洲视频网在线直播| 亚洲精选成人| 亚洲人成网站777色婷婷| 精品99视频|