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

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

            // 。。。。。進行事件響應

            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 :: 系統預定義的事件 . subscribeEvent:: 注冊函數,它事件與響應函數聯接在一起。
            在 ogre 程序中,當偵聽器收到鍵盤,鼠標消息時,首先經過適當的轉換( CEGUI 可以識別)再傳遞給 CEGUI 。下面這個函數執行鼠標鍵標識轉換。
            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 需要知道的鍵盤,鼠標消息告知它。即在 OGRE 處理這些消息時通知 CEGUI 。以下這函數說明了用法。
            ?????? void mouseMoved (MouseEvent *e)// 鼠標移動
            ?????? {
            ????????????? CEGUI::System::getSingleton().injectMouseMove(
            ?????????????????? e->getRelX() * mGUIRenderer->getWidth(),
            ?????????????????? e->getRelY() * mGUIRenderer->getHeight());
            ?????????????????? e->consume();
            ?????? }

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

            ?

            posted on 2006-11-01 15:32 清源游民 閱讀(5250) 評論(5)  編輯 收藏 引用 所屬分類: OGRE

            FeedBack:
            # re: 在OGRE中使用CEGUI的筆記
            2007-02-28 15:53 | pathbreaker
            在Ogre中使用最新的CEGUI需要包含那些文件?  回復  更多評論
              
            # re: 在OGRE中使用CEGUI的筆記
            2007-03-01 21:58 | 清源游民
            @pathbreaker
            CEGUI更新到了0.5.1,我在學習,隨便把筆記放上來,你可以看看。
              回復  更多評論
              
            # re: 在OGRE中使用CEGUI的筆記
            2007-07-30 21:04 | freezing
            正在學習CEGUI,你的筆記正好借鑒,呵呵  回復  更多評論
              
            # re: 在OGRE中使用CEGUI的筆記
            2007-10-16 23:09 | yifan
            ogre中實現倒影的那個例子demo_fresnel 想其中加入cegui 實現鼠標菜單控制 結果導致水面倒影不見了 有誰知道是怎么回事嗎 初學 好多問題還不太懂 希望得到高手指點 謝謝!!!  回復  更多評論
              
            # re: 在OGRE中使用CEGUI的筆記[未登錄]
            2008-01-11 18:00 | zz
            gou si  回復  更多評論
              
            <2006年11月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产综合免费精品久久久| 久久人与动人物a级毛片| www.久久热.com| 久久综合中文字幕| 久久亚洲视频| 久久精品国产久精国产果冻传媒| 久久天天躁狠狠躁夜夜躁2O2O| 狠狠干狠狠久久| 亚洲国产视频久久| 国产精品国色综合久久| 久久有码中文字幕| 久久精品免费一区二区三区| 欧美大战日韩91综合一区婷婷久久青草| 婷婷久久综合九色综合九七| 狠狠88综合久久久久综合网| 女同久久| 久久亚洲国产欧洲精品一| 日韩人妻无码一区二区三区久久99 | 久久亚洲精品无码AV红樱桃| 亚洲国产精品久久久久网站| 77777亚洲午夜久久多人| 国产精品午夜久久| 国产情侣久久久久aⅴ免费| 人人狠狠综合88综合久久| 精品九九久久国内精品| 久久婷婷五月综合97色直播| 国产精品99久久久久久董美香| 久久久久亚洲Av无码专| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久亚洲精品国产亚洲老地址 | 久久国产精品波多野结衣AV| 久久人妻少妇嫩草AV无码专区| 久久婷婷五月综合色99啪ak| 国产精品99久久久久久www| 成人久久精品一区二区三区| 香蕉久久夜色精品升级完成| 思思久久99热只有频精品66| 人人狠狠综合久久亚洲高清| 久久久久久久综合综合狠狠| 久久精品国产第一区二区| 青青草国产成人久久91网|