• <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>

            OGre實際應用程序[五]譯

            Posted on 2008-09-06 16:56 美洲豹 閱讀(242) 評論(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 © 美洲豹

            狠狠色丁香久久婷婷综| 久久国产热这里只有精品| 77777亚洲午夜久久多喷| 久久夜色精品国产欧美乱| 99久久精品久久久久久清纯| 久久久久无码精品| 色欲久久久天天天综合网精品| 日本久久久精品中文字幕| 99久久综合国产精品免费| 99久久久国产精品免费无卡顿| 久久综合五月丁香久久激情| 久久久久亚洲AV成人片| 亚洲性久久久影院| 国产精品毛片久久久久久久| 国产精品久久久久久久app| 国产精品久久成人影院| 亚洲乱码精品久久久久..| 久久综合九色综合久99| 久久99国产精品二区不卡| 久久精品国产AV一区二区三区| 亚洲嫩草影院久久精品| 欧洲人妻丰满av无码久久不卡| 亚洲午夜无码久久久久小说| 久久综合狠狠综合久久激情 | 国产精品久久久久久福利漫画| 人妻丰满?V无码久久不卡| 99久久免费只有精品国产| 国产精品一区二区久久国产| 亚洲国产另类久久久精品黑人 | 久久综合给合久久狠狠狠97色69| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲精品无码久久久| 久久久久国产成人精品亚洲午夜| 久久亚洲高清观看| 久久精品国产亚洲一区二区| 久久国产精品无码一区二区三区| 亚洲AV无一区二区三区久久| 亚洲AV日韩AV天堂久久| 热re99久久精品国99热| 成人免费网站久久久| 9久久9久久精品|