• <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>
            隨筆-380  評(píng)論-37  文章-0  trackbacks-0

            轉(zhuǎn):http://m.shnenglu.com/yuanyajie/archive/2006/11/01/14485.html

            使用 cegui 來(lái)制作界面 , 不論在何種平臺(tái)下 , 有基本的三大步驟要做 :
            1, 創(chuàng)建一個(gè) CEGUI::Render 實(shí)例
            2, 創(chuàng)建 CEGUI::System 對(duì)象
            3, 調(diào)用各種方法來(lái)渲染用戶界面
            第一步 , 在我使用的 ogre 環(huán)境下使用以下代碼來(lái)創(chuàng)建 CEGUI::Render 實(shí)例
            Ogre3D
            CEGUI::OgreCEGUIRenderer* myRenderer =
                   new CEGUI::OgreCEGUIRenderer(myRenderWindow);
            第二步相當(dāng)簡(jiǎn)單 , 可使用
            new CEGUI::System(myRenderer);
            第三步,基本上來(lái)講,大部分平臺(tái)下,如 direct3D, OpenGL, 我們?cè)阡秩狙h(huán)的尾部調(diào)用
            CEGUI::System::renderGUI 來(lái)開(kāi)始界面的渲染。如果我們使用 ogre3d 引擎,這一步不需要
            我們顯示的執(zhí)行。因?yàn)?ogre 引擎已經(jīng)考慮了。
            除了這三大步之外,我們還有一些工作要做,首先,我們需要加載數(shù)據(jù)文件,并且完成初始化工作。
            CEGUI 使用了許多類型的文件。 CEGUI 使用一個(gè)稱為 ResourceProvider 的幫助對(duì)象,用它來(lái)做為核心 CEGUI 庫(kù)與外部文件加載系統(tǒng)的接口。通過(guò)實(shí)現(xiàn)一個(gè)特定的 ResourceProvider 對(duì)象, cegui 的渲染模塊就可以與外部系統(tǒng)的資源管理器、文件加載子系統(tǒng)無(wú)縫地集成。 CEGUI 需要的數(shù)據(jù)文件便可以通過(guò)外部系統(tǒng)提供的功能來(lái)進(jìn)行加載。 CEGUI 中的大部分文件是以 XML 的文件格式來(lái)保存的。缺省情況下, CEGUI 在內(nèi)部使用 Xerces-C++ 庫(kù)來(lái)分析 XML 文件,使用 schema 來(lái)對(duì) xml 進(jìn)行校驗(yàn), schema 文件以標(biāo)準(zhǔn)的 .xsd 擴(kuò)展名來(lái)保存 . 許多文件本質(zhì)上都是 XML 格式的文件,但是根據(jù)其意義不同,分別使用了不同的文件擴(kuò)展名。
            .Imageset 文件可將一幅圖像看做若干小圖像的集合。換名話說(shuō),就是將一幅圖像的某個(gè)區(qū)域看做一幅獨(dú)立的圖片來(lái)使用。
            .Font 定義了在 CEGUI 中所使用的字體類型。
            .scheme  可以將許多數(shù)據(jù)組合在一起使用,它也是裝載與注冊(cè) widget 最方便的方法。在一個(gè) .scheme 文件中可以包括下列幾種數(shù)據(jù):
            Imagest,font, window Set, window Alias
            window set 指定了裝載模塊( .dll 等)的名稱,和一組可以注冊(cè)到系統(tǒng)中的 widget.
            window alias 提供了別名的功能,實(shí)現(xiàn)已經(jīng)注冊(cè)的 window/widget 的形式上的隱藏。
            .Layout  包含了窗口布局的 xml 表示。每個(gè)嵌套的 'window' 元素定義了被創(chuàng)建的 window 或是 widget."Property" 元素定義了窗口的設(shè)置與屬性值。
            .config 是可供選擇的配置文件,他可指定一些缺省的屬性。
            我們使用 CEGUI 來(lái)制作圖形界面,至少要使用以下三種文件:
            .imageset, .Font . Scheme;
            當(dāng)然,我們知道在一個(gè) Scheme 中是可以包括 imageset 與 Font 的。
            CEGUI::SchemeManager::getSingleton().loadScheme(“../datafiles/schemes/TaharezLook.scheme”);
            // load in a font.  The first font loaded automatically becomes the default font.
            CEGUI::FontManager::getSingleton().createFont(“../datafiles/fonts/Commonwealth-10.font”);
            對(duì)于 ogre 的使用者來(lái)講,應(yīng)該在 resources.cfg 將這些資源所在的目錄加進(jìn)去。
            我們可用下面的語(yǔ)句來(lái)指定 cegui 所需要的缺省的 font 與 cursor 資源。
            在 cegui 的概念里,每個(gè) widget 都是一個(gè) window, 從編程的角度來(lái)講,每個(gè) widget 類都是從同一個(gè)相同的 window 基類繼承而來(lái)的 . 因此, widget 與 window 有著基本相同的行為。
            窗體的許多屬性與設(shè)置在窗口層樹(shù)上是可以遺傳的。高一級(jí)窗口的屬性與行為會(huì)影響到下一級(jí)窗口的屬性與行為。例如附著在某個(gè) window 上的 window 與 widget 會(huì)被父 window 影響。當(dāng)父窗口被 destroy 時(shí),它所附屬的所有的子窗口與 widget 也都將被 destroy.
            創(chuàng)建 CEGUI 窗口,我們可以使用兩種形式,一是 C ++代碼,二是編輯 XML layout 文件。
            注意:在 CEGUI 中,所有的 window 都是由 WindowManager singleton object 來(lái)統(tǒng)一創(chuàng)建的。我們首先得到這個(gè)對(duì)象:
            using namespace CEGUI;
            WindowManager& wmgr = WindowManager::getSingleton();
            一般來(lái)講,我們總是創(chuàng)建一個(gè) DefaultWindow 來(lái)做為我們將使用的窗口的 Root, 在這種方式下,我們會(huì)有比較好的靈活性。
            Window* myRoot = wmgr.createWindow(“DefaultWindow”, “root”);
            System::getSingleton().setGUISheet(myRoot);
            createwindows() 函數(shù)所使用的第一個(gè)參數(shù),指明了將要?jiǎng)?chuàng)建的窗口類型,它一般是在我們使用的 .scheme 文件中所注冊(cè)過(guò)的,當(dāng)然還有一些系統(tǒng)定義的,總是有效的窗口類型如上面所提到的 DefaultWindow.DefualtWindow 是不可見(jiàn)的,它只是做為所有窗口的 root 來(lái)使用。
            一般我們總是要?jiǎng)?chuàng)建一個(gè) Framewindow, 它可以包括其他窗口與 widget ,本身也是可視的。
            FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow(“TaharezLook/FrameWindow”, “testWindow”);
            之后,我們將創(chuàng)建的窗口掛到 root 上,形成一個(gè)層次關(guān)系。
            myRoot->addChildWindow(fWnd);
            編輯 xml layout 文件,可使用專門(mén)提供的制作工具。具體的使用方法可以參閱相關(guān)文檔,這里說(shuō)一下如何使用制作好的 xml layout 文件。
            using namespace CEGUI;
            Window* myRoot = WindowManager::getSingleton().loadWindowLayout(“test.layout”);
            System::getSingleton().setGUISheet(myRoot);
            首先,將 layout 文件裝載進(jìn)來(lái),再指定根結(jié)點(diǎn)。
            CEGUI 本身偵測(cè)用戶輸入,這些不是 CEGUI 的責(zé)任,而是程序的員的責(zé)任。當(dāng)有用戶外部輸入時(shí),我
            們可以選擇將這些消息告知 CEGUI ,這樣 CEGUI 才會(huì)響應(yīng)。
            在 ceguir::System 類中定義了一組函數(shù),它作為我們進(jìn)行消息傳遞的接口。
            bool injectMouseMove(float delta_x, float delta_y);
            bool injectMousePosition(float x_pos, float y_pos);
            bool injectMouseLeaves(void);
            bool injectMouseButtonDown(MouseButton button);
            bool injectMouseButtonUp(MouseButton button);
            bool injectKeyDown(uint key_code);
            bool injectKeyUp(uint key_code);
            bool injectChar(utf32 code_point);
            bool injectMouseWheelChange(float delta);
            bool injectTimePulse(float timeElapsed);
            這些函數(shù)的返回值說(shuō)明了 CEGUI 是否已經(jīng)將傳入的消息 consume 掉了。
            CEGUI 使用回調(diào)機(jī)制來(lái)進(jìn)行消息處理。可以為某個(gè)窗體的特定事件注冊(cè)一個(gè)函數(shù),當(dāng)窗體事件發(fā)生時(shí), CEGUI 會(huì)自動(dòng)調(diào)用所注冊(cè)的函數(shù)。
            bool TutorialApplication::handlePopMenu(constCEGUI::EventArgs& e)

            // 。。。。。進(jìn)行事件響應(yīng)

            void setupEventHandlers(void)
                {
                   CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
                   wmgr .getWindow((CEGUI::utf8*)"MyButton")->subscribeEvent(
                   CEGUI ::PushButton::EventClicked, CEGUI::Event::Subscriber(&TutorialApplication::handlePopMenu, this));
               }

            EventClicked :: 系統(tǒng)預(yù)定義的事件 . subscribeEvent:: 注冊(cè)函數(shù),它事件與響應(yīng)函數(shù)聯(lián)接在一起。
            在 ogre 程序中,當(dāng)偵聽(tīng)器收到鍵盤(pán),鼠標(biāo)消息時(shí),首先經(jīng)過(guò)適當(dāng)?shù)霓D(zhuǎn)換( CEGUI 可以識(shí)別)再傳遞給 CEGUI 。下面這個(gè)函數(shù)執(zhí)行鼠標(biāo)鍵標(biāo)識(shí)轉(zhuǎn)換。
            CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
            {
                   switch (buttonID)
                   {
                   case MouseEvent::BUTTON0_MASK:
                          return CEGUI::LeftButton;
                   case MouseEvent::BUTTON1_MASK:
                          return CEGUI::RightButton;
                   case MouseEvent::BUTTON2_MASK:
                          return CEGUI::MiddleButton;
                   case MouseEvent::BUTTON3_MASK:
                          return CEGUI::X1Button;
                   default:
                          return CEGUI::LeftButton;
                   }
            }

            將 CEGUI 需要知道的鍵盤(pán),鼠標(biāo)消息告知它。即在 OGRE 處理這些消息時(shí)通知 CEGUI 。以下這函數(shù)說(shuō)明了用法。
                   void mouseMoved (MouseEvent *e)// 鼠標(biāo)移動(dòng)
                   {
                          CEGUI::System::getSingleton().injectMouseMove(
                               e->getRelX() * mGUIRenderer->getWidth(),
                               e->getRelY() * mGUIRenderer->getHeight());
                               e->consume();
                   }

                   void mousePressed (MouseEvent *e)// 鼠標(biāo)按下
                   {
                          CEGUI::System::getSingleton().injectMouseButtonDown(
                           convertOgreButtonToCegui(e->getButtonID()));
                         e->consume();
                   }
                   void mouseReleased (MouseEvent *e)// 鼠標(biāo)彈起
                   {
                          CEGUI::System::getSingleton().injectMouseButtonUp(
                          convertOgreButtonToCegui(e->getButtonID()));
                          e->consume();
                   }

                   void keyPressed(KeyEvent* e)// 鍵按下
                   {
                          CEGUI::System::getSingleton().injectKeyDown(e->getKey());
                          CEGUI::System::getSingleton().injectChar(e->getKeyChar());
                          e->consume();
                   }
                   void keyReleased(KeyEvent* e)// 鍵彈起
                   {
                         CEGUI::System::getSingleton().injectKeyUp(e->getKey());
                         e->consume();

                   }
            在 CEGUI 中使用中文的問(wèn)題:   現(xiàn)在總結(jié)了一下在 CEGUI 中顯示中文需要注意的事項(xiàng) :
                1 、將 simhei.ttf copy to \ogrenew\Samples\Media\gui
                2 、將 simhei-12.font  拷到上目錄內(nèi)容為
            <?xml version="1.0"  ?>
            <Font Name="SimHei-12" Filename="simhei.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600" 
            AutoScaled="true">
            <GlyphSet Glyphs=" 你好世界退出演示渲染到新材質(zhì)建編輯窗口 " /> ( <---- 自己要用到的漢字)
            </Font>
            注意大小寫(xiě)?。?GlyphSet Glyphs 是在程序中要用到的漢字,它是讓 cegui 預(yù)生成一個(gè)字符圖像集用的(想當(dāng)然的 :-P )如果修改了這個(gè)文件,注意要用 Unicode ( UTF-8 )的編碼來(lái)保存,在 vc7.1 中:文件 -> 高級(jí)保存選項(xiàng)   的   編碼   欄中選擇。
                3 、在 TaharezLook.scheme 中
                 <Font Name="Tahoma-12" Filename="tahoma-12.font" /> 后加入
                 <Font Name="SimHei-12" Filename="simhei-12.font" />  注意大小寫(xiě)
                 以上是一些準(zhǔn)備工作
                4 、在自己的應(yīng)用中設(shè)置默認(rèn)字體
                mGUISystem->setDefaultFont((CEGUI::utf8*)"Tahoma-12"); 改為
                mGUISystem->setDefaultFont((CEGUI::utf8*)"SimHei-12");
                5 、在自己的應(yīng)用程序中就可以把相關(guān)的 Text 屬性該為中文了,如:
                item = new CEGUI::ListboxTextItem((CEGUI::utf8*)" 退出 ", 6);
                同樣要注意的是要保存為 Unicode ( UTF-8 )的編碼。同時(shí)這些字要是在 simhei-12.font 中定義過(guò)的字,當(dāng)然也可以象那個(gè) CEGUIChieseDemo
            那樣用動(dòng)態(tài)生成如:
                gfont->defineFontGlyphs(gfont->getAvailableGlyphs() + (utf8*)" 當(dāng)前最佳壞平均的框架率三角 ");
                編譯自己的程序,應(yīng)該就可以看到中文了,羅嗦一下,記住只要有漢字出現(xiàn)的文件就保存為 Unicode ( UTF-8 )編碼的?。?!

            posted on 2009-11-27 03:09 小王 閱讀(1005) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 游戲引擎
            久久精品国产亚洲AV香蕉| 久久天堂电影网| 欧美大战日韩91综合一区婷婷久久青草| 久久久久亚洲AV成人片| 青青草原综合久久大伊人精品| 久久精品无码一区二区三区日韩| 久久婷婷五月综合国产尤物app| 亚洲精品高清国产一线久久 | 久久综合狠狠综合久久激情 | a级毛片无码兔费真人久久| 久久国产精品免费一区二区三区| 久久久久久精品免费看SSS| 日韩精品久久久久久| 国产成人精品三上悠亚久久| 伊人久久大香线蕉精品| 久久久久亚洲av综合波多野结衣| 久久99精品国产自在现线小黄鸭| 精品免费久久久久国产一区| 精品久久8x国产免费观看| 香蕉aa三级久久毛片| 久久成人精品| 99久久人人爽亚洲精品美女| 久久婷婷五月综合色奶水99啪| 欧美午夜A∨大片久久| 成人精品一区二区久久久| 久久精品午夜一区二区福利| 久久精品国产亚洲AV香蕉| 国产精品丝袜久久久久久不卡| 精品国产VA久久久久久久冰| 精品国产乱码久久久久久人妻| 久久噜噜久久久精品66| 国产成人香蕉久久久久| 一本大道久久a久久精品综合| 日韩精品久久无码人妻中文字幕 | 国产精品久久久香蕉| 久久亚洲色一区二区三区| 亚洲国产精品人久久| 国产精品女同一区二区久久| 国产成人99久久亚洲综合精品| 免费观看成人久久网免费观看| 久久青青草原国产精品免费|