• <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>
            萬星星@豌豆莢 歡迎加入我們
            一個(gè)吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            背景:項(xiàng)目需求要用到CEGUI,于是匆忙上手,后來發(fā)現(xiàn)很多東西不理解導(dǎo)致開發(fā)不順暢,尤其是CEGUI中的各種文件格式的理解。找到官方WIKI的教程,仔細(xì)看下來,雖不是那么震撼,對整個(gè)系統(tǒng)的理解還是不無裨益。有一類開發(fā)者為快槍手,擅長快速上手,然不求甚解,面對棘手問題比較抓狂。我自己雖不缺少快槍手的技術(shù),但每每遇到商業(yè)開發(fā),都會(huì)謹(jǐn)慎的仔細(xì)學(xué)習(xí)用到的庫,以求全盤掌控,往往比較累。在閱讀官方教程同時(shí)隨手做了翻譯,一則體驗(yàn)了evernote筆記軟件;二則很久沒寫字,鍛煉一下文字組織能力;三則希望對那些不想看英文的朋友有幫助(我自己找的時(shí)候發(fā)現(xiàn)這方面資料不多)。
            注:evernote的筆記導(dǎo)出來顯然很丑,或許我不會(huì)用,或許我歪用了它,希望得到高人指點(diǎn)!


            CEGUI 實(shí)踐1:入門

            創(chuàng)建于:2012-5-7 18:13
            更新時(shí)間:2012-5-8 17:26
            來源:http://www.cegui.org.uk/wiki/index.php/CEGUI_In_Practice_-_Introduction

            CEGUI 實(shí)踐1

            歡迎來到如何使用CEGUI 系列教程的第一篇。教程主要是通過代碼進(jìn)行講解,我也會(huì)嘗試使用少量的.layout 布局。你一旦清楚了如何在代碼中使用各種部件(Widget),通過腳本來控制它們也就變得非常容易。

            【請注意,我是一名Ogre3d 使用者,所以初始化設(shè)置是從如何引導(dǎo)并啟動(dòng)Ogre3d 開始。】

            介紹CEGUI

            首先請注意,CEGUI 使用了許多單件類。單件類,如果你沒有使用過,可以理解為在代碼中允許全局訪問,且保證只創(chuàng)建一個(gè)類實(shí)例。下面是本例中將會(huì)用到的一些單件:

            CEGUI::System - 大魔法師(譯注:教父、大師,指統(tǒng)治級別)。有很多設(shè)置和獲取缺省值的函數(shù)。
            CEGUI::WindowManager - 管理CEGUI 所有窗口,用于創(chuàng)建或刪除。

            CEGUI::SchemeManager - 管理所有配色方案(Scheme)。

            CEGUI::FontManager - 管理應(yīng)用程序中用到的不同字體。

            開始

            我們從一些設(shè)置工作開始,第一件要做的事情就是建立系統(tǒng)并使其跑起來。因?yàn)槲沂且幻鸒gre 使用者,所以用Ogre 來構(gòu)建可運(yùn)行的系統(tǒng)。還有多種以其它渲染系統(tǒng)來啟動(dòng)的方法,參見這里:The Beginner Guide to Getting CEGUI Rendering

            Ogre3d 方式演示如下:

            包含必要的頭文件
            include "CEGUI.h"#include "RendererModules/Ogre/CEGUIOgreRenderer.h"


            啟動(dòng)CEGUI
            CEGUI::OgreRenderer* renderer = &CEGUI::OgreRenderer::bootstrapSystem();


            【注意:bootstrapSystem 是一個(gè)比較新的方法,在CEGUI 0.7.1 中才引入。Wiki 上的一些例子還在使用舊版本的CEGUI ,你需要確認(rèn)自己正在使用的版本。】

            上面的代碼創(chuàng)建一個(gè)Ogre3d 渲染實(shí)例用于Ogre3d和CEGUI,如果運(yùn)行沒問題的話,后面就不用再怎么管它了。它建立起用Ogre 渲染CEGUI 的關(guān)聯(lián)。請注意:如果Ogre 是自動(dòng)創(chuàng)建渲染窗口(大多如此)的話,你需要這么調(diào)用一下。假如你想手動(dòng)創(chuàng)建一個(gè)Ogre3d 窗口,可以調(diào)用CEGUI::OgreRenderer::bootstrapSystem(Ogre::RenderWindow *) 重載版本。

            還有一點(diǎn)值得一提的是bootstrapSystem() 會(huì)創(chuàng)建一個(gè)CEGUI::System 實(shí)例。這一點(diǎn)很重要,因?yàn)槿绻阋呀?jīng)創(chuàng)建過CEGUI::System ,這里就會(huì)拋出一個(gè)異常。

            呃,來點(diǎn)腳本文件

            上面我們就只調(diào)用了那一個(gè)函數(shù),在進(jìn)行更多CEGUI 處理之前,我們需要了解一些基礎(chǔ)知識(shí)。

            CEGUI 是一個(gè)高度腳本化的庫,大量的內(nèi)容素材定義在各種類型的.xml 文件中。首先提到的是配色方案(*.scheme),GUI 中用到的每個(gè)部件都定義在.scheme 文件中。它還可以包含后面提到的子腳本文件,后面的教程會(huì)對這些文件進(jìn)行詳細(xì)講解。下面是一個(gè)你可能會(huì)碰到的示例:

            <?xml version="1.0" ?><GUIScheme Name="TaharezLook">
                    <Imageset Filename="TaharezLook.imageset" />
                    <Font Filename="DejaVuSans-10.font" />
                    <LookNFeel Filename="TaharezLook.looknfeel" />
                    <WindowRendererSet Filename="CEGUIFalagardWRBase" />
                    <FalagardMapping WindowType="TaharezLook/Button"      TargetType="CEGUI/PushButton"  Renderer="Falagard/Button"       LookNFeel="TaharezLook/Button" />
                    <FalagardMapping WindowType="TaharezLook/Checkbox"    TargetType="CEGUI/Checkbox"    Renderer="Falagard/ToggleButton" LookNFeel="TaharezLook/Checkbox" /></GUIScheme>

            接著提到的腳本是布局文件(*.layout)。它也是xml 格式的文件,用于定義顯示在屏幕上的窗口的布局。比如想創(chuàng)建一個(gè)聊天窗口,我們可能需要一個(gè)ChatWindow.layout 文件存放在某個(gè)地方。它應(yīng)該描述窗口外觀(大小,屏幕位置等),輸入框和發(fā)送消息按鈕的擺放位置。下面是一個(gè)演示.layout 文件的小例子:

            <?xml version="1.0" encoding="UTF-8"?><GUILayout >
                <Window Type="TaharezLook/FrameWindow" Name="ConsoleRoot" >
                    <Property Name="Text" Value="Chat Window" />
                    <Property Name="TitlebarFont" Value="DejaVuSans-10" />
                    <Property Name="TitlebarEnabled" Value="True" />
                    <Property Name="UnifiedAreaRect" Value="{{0.114991,0},{0.358182,0},{0.519469,0},{0.775455,0}}" />
                    <Window Type="TaharezLook/Editbox" Name="ConsoleRoot/EditBox" >
                        <Property Name="MaxTextLength" Value="1073741823" />
                        <Property Name="UnifiedAreaRect" Value="{{0.0201637,0},{0.787097,0},{0.694549,0},{0.957693,0}}" />
                        <Property Name="TextParsingEnabled" Value="False" />
                    </Window></GUILayout>

            字體(*.font)腳本也非常有用,用于描述CEGUI 中用到的字體,下面是一個(gè)例子:

            <?xml version="1.0" ?><Font Name="DejaVuSans-10" Filename="DejaVuSans.ttf" Type="FreeType" Size="10" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>

            另外一個(gè)重要的腳本是圖像集(*.imageset),定義每種部件的視覺效果。CEGUI 中用戶看到的部件視覺部分對應(yīng)于一張大紋理文件中的坐標(biāo)。比如,按鈕在.imageset 中定義為一張紋理圖像(*.png,*.bmp,*.jpg 等)中像素點(diǎn)100×320開始寬高為50×50的圖形。這些是需要在圖像集中定義的。下面是一個(gè)例子:

            <?xml version="1.0" ?><Imageset Name="TaharezLook" Imagefile="TaharezLook.tga" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true">
                    <Image Name="MouseArrow" XPos="138" YPos="127" Width="31" Height="25" XOffset="0" YOffset="0" /></Imageset>

            最后是感觀風(fēng)格(*.looknfeel)腳本。這個(gè)文件看起來相當(dāng)邪惡(譯注:龐雜),卻能將所有人從噩夢中拯救,這里為了節(jié)省空間不再提交例子。這個(gè)文件用于確定所有部件(CEGUI 中window/object/item 表示的)的感觀和反饋效果。比如,按鈕在鼠標(biāo)懸停時(shí)的效果,如何構(gòu)建窗口的邊框和背景。每種配色方案一般都有自己的感觀風(fēng)格,使得CEGUI 部件的基本構(gòu)造更加可定制化。

            接著開始部分

            現(xiàn)在我們對CEGUI 中用到的腳本文件有了一些基本認(rèn)識(shí)(別擔(dān)心,隨著學(xué)習(xí)的深入,你會(huì)發(fā)現(xiàn)它們更容易理解,并不再那么嚇人,開始階段用到最多的是.layout 文件。),接下來讓我們開始做一些有用的事情!

            截止到上次的代碼,僅僅是啟動(dòng)了CEGUI 。但就其本身而言,它并不知道你想干嘛。首當(dāng)其沖的是告訴它我們想使用的配色方案。如上所述,.Scheme 文件包含一個(gè)部件列表和其它一些腳本文件,可以引入圖像集、感觀風(fēng)格和字體各一個(gè)。

            // Load the scheme
            CEGUI::SchemeManager::getSingleton().create( "TaharezLook.scheme" );


            如果你想使用.Scheme 文件中未指定的圖像集或者字體,實(shí)現(xiàn)起來很簡單,用相關(guān)的管理對象加載它們即可。由于本篇是入門教程,我將會(huì)在后面章節(jié)中解釋這些管理對象。

            下一步,定義一些缺省值:

            // Set the defaults
            CEGUI::System::getSingleton().setDefaultFont( "DejaVuSans-10" );
            CEGUI::System::getSingleton().setDefaultMouseCursor( "TaharezLook", "MouseArrow" );


            使用全局CEGUI::System 對象的函數(shù)來設(shè)置缺省字體和鼠標(biāo)光標(biāo)。參考TaharezLook.scheme (在cegui/datafiles/schemes文件夾中),你會(huì)發(fā)現(xiàn)它通過標(biāo)簽加載了DejaVuSans-10.font 文件中定義的字體。標(biāo)記"MouseArrow" 可以在圖像集"TharezLook" 中找到。我想這些都是自解釋的,無需多言。

            嗯,現(xiàn)在CEGUI 清楚了我們想使用的一些缺省設(shè)置。我們創(chuàng)建一個(gè)根窗口,作為其它一切窗口的載體。

            CEGUI 采用父/子關(guān)系來組織窗口,所以第一要?jiǎng)?wù)是創(chuàng)建所有其它窗口的父窗口:

            CEGUI::Window* myRoot = CEGUI::WindowManager::getSingleton().createWindow( "DefaultWindow", "_MasterRoot" );


            上面WindowManager 單件的函數(shù)調(diào)用創(chuàng)建一個(gè)"DefaultWindow" 類型名為"_MasterRoot" 的窗口。這個(gè)缺省窗口就是根窗口。缺省窗口是空的(或者說透明的)。根窗口的名字是隨意指定的,然而我個(gè)人喜歡用_MasterRoot ,因?yàn)槲业钠渌翱谝话悴粫?huì)用這個(gè)名字。

            窗口創(chuàng)建后,需要設(shè)置它為根窗口:

            CEGUI::System::getSingleton().setGUISheet( myRoot );


            系統(tǒng)對象的函數(shù)調(diào)用,把
            myRoot 作為缺省窗口。記住上面myRoot 創(chuàng)建時(shí)起的名字"_MasterRoot" 。

            總結(jié)

            雖然本篇教程不是特別精彩,但CEGUI 到這里已經(jīng)設(shè)置完畢,我們接下來不斷添加窗口,做一些GUI 的小實(shí)驗(yàn),比如創(chuàng)建窗口,按鈕,進(jìn)行點(diǎn)擊等等有趣的事情。后面的教程會(huì)演示如何使CEGUI 識(shí)別點(diǎn)擊,窗口拖拽,輸入等等!謝謝閱讀!


            CEGUI 實(shí)踐2:創(chuàng)建部件(Widgets)

            創(chuàng)建于:2012-5-8 16:38
            更新時(shí)間:2012-5-8 18:30
            來源:http://www.cegui.org.uk/wiki/index.php/CEGUI_In_Practice_-_Creating_widgets

            CEGUI 實(shí)踐2

            歡迎回來,這是CEGUI 實(shí)踐系列教程第二篇。本篇在前一篇教程CEGUI 實(shí)踐 - 入門的基礎(chǔ)上構(gòu)建,演示如何創(chuàng)建部件并管理它們。

            部件

            上個(gè)例子中我們演示了如何用Ogre 啟動(dòng)系統(tǒng),并簡單的介紹了CEGUI 的腳本文件。我們接下來要理解什么是部件以及如何使用它們。先創(chuàng)建一個(gè)窗口用于在屏幕中間顯示一張圖片:

            CEGUI::Window *myImageWindow = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/StaticImage","PrettyWindow" );


            CEGUI的代碼實(shí)現(xiàn)了很多派生類用于窗口創(chuàng)建,基類CEGUI::Window 是一般的窗口。CEGUI::WindowManager 調(diào)用工廠類來創(chuàng)建窗口并返回窗口指針。第一個(gè)參數(shù),"TaharezLook/StaticImage" 告訴類廠創(chuàng)建什么樣的窗口,這些類型在.scheme 文件中列出,更加詳細(xì)的定義在其它的.xml 文件中。第二個(gè)參數(shù)是窗口名。

            【注意:需要提醒的是,窗口名不是強(qiáng)制必須的,但需要避免名字重復(fù)。一些用戶傾向于采用類似ParentName/ChildName 的命名習(xí)慣,例如"ConsoleWindow/SendButton" 或"_MasterRoot/HealthBar" 。】

            窗口一旦創(chuàng)建,myImageWindow 即指向一個(gè)派生于CEGUI::Window 的CEGUI::DefaultWindow 窗口。通過查看.scheme文件你會(huì)發(fā)現(xiàn)部件的派生關(guān)系是通過TargetType=tag 指出的。

            接下來我們需要為窗口設(shè)置一些屬性。可以通過屬性集來做到,或者通過函數(shù)調(diào)用。后一種方式多少有點(diǎn)不爽,因?yàn)槟憧赡苄枰獜?qiáng)制轉(zhuǎn)換到正確的窗口類型以訪問其成員函數(shù),但可能更加直觀一些。

            統(tǒng)一度量系統(tǒng)

            我們創(chuàng)建好部件之后,現(xiàn)在需要把它擺放到某個(gè)位置并指定大小。通過代碼方式實(shí)現(xiàn),OK 不?

            不著急下手,先來理解CEGUI 中怎么處理定位。CEGUI 使用了一種統(tǒng)一度量系統(tǒng)。

            CEGUI::UDim(scale,offset);


            第一個(gè)數(shù)字是屏幕上的一個(gè)相對點(diǎn),取值范圍是[0, 1] ,所以沿著X 軸(屏幕上是從左向右)看去,UDim(0.5,0) 在屏幕的中間位置。Udim(0.0,50) 在距離屏幕左邊的+50 像素位置,Udim(0.75,10) 在水平方向上位于屏幕的3/4 位置處加額外10像素。

            屏幕上的點(diǎn)(UVector2)由兩個(gè)UDim 組成:

            CEGUI::UVector2(UDim x,UDim y);


            同理,CEGUI::Rect由四個(gè)UDim 組成:

            CEGUI::URect(CEGUI::Udim left,CEGUI::Udim top,CEGUI::Udim right,CEGUI::Udim bottom);


            既然我們清楚了如何定位,先把我們創(chuàng)建的窗口移到屏幕中央:

            部件演練

            myImageWindow->setPosition(CEGUI::UVector2(CEGUI::UDim(0.5,0),CEGUI::UDim(0.5,0)));


            看上去可能有點(diǎn)丑,分開來看吧。setPosition接收一個(gè)UVector2 參數(shù) ,每個(gè)UVector2 由X 和 Y Udim 組成,每個(gè)Udim 又是由比率和絕對浮點(diǎn)數(shù)構(gòu)成。

            這里我們已經(jīng)移動(dòng)窗口到屏幕中央,但是CEGUI 怎么知道它有多大?這里設(shè)置大小為150×100 像素【注意:為了可讀性我沒加命名空間】。


            myImageWindow->setSize(UVector2(UDim(0,150),UDim(0,100)));


            我們指定比率值為0 ,實(shí)際的像素大小就等于那個(gè)絕對參數(shù)值。絕對參數(shù)值是比率值的增量,在這里不希望大小受比率參數(shù)的影響。如果要?jiǎng)?chuàng)建一個(gè)占滿整個(gè)窗口的閃屏,一般大小設(shè)置為UVector2(UDim(1,0),UDim(1,0)) ,原點(diǎn)設(shè)置為UVector2(Udim(0,0), UDim(0,0)) 。


            窗口大小現(xiàn)在也確定了,需要告訴它顯示什么圖像!可以通過PropertySet 做到,實(shí)現(xiàn)如下:

            myImageWindow->setProperty("Image","set:TaharezLook image:full_image");


            第一個(gè)參數(shù)是想設(shè)置哪個(gè)屬性,第二個(gè)參數(shù)是給屬性設(shè)置什么值。示例中的第二個(gè)參數(shù)是一個(gè)字符串,由兩個(gè)部分組成。'set:' 部分指定了引用的圖像集,'image:' 部分指定了圖像,這里顯示的是full_image 。

            TaharezLook 的屬性列表可以訪問這里獲取[1]

            窗口創(chuàng)建完成之后,需要添加到當(dāng)前的根窗口中:

            CEGUI::System::getSingleton().getGUISheet()->addChildWindow(myImageWindow);


            這樣窗口就會(huì)顯示出來.

            總結(jié)

            通過這篇短小的教程,我們簡單介紹了PropertySet 的用法(很重要!),講解了一些CEGUI 中統(tǒng)一度量系統(tǒng)是如何工作的知識(shí)。雖然還不十分有用,但是我們已經(jīng)開始理解如何使用CEGUI 的一些功能了。下一講,我們將學(xué)習(xí)如何利用交互。


            CEGUI 實(shí)踐3:管理輸入

            創(chuàng)建于:2012-5-16 14:21
            更新時(shí)間:2012-5-16 16:32
            來源:http://www.cegui.org.uk/wiki/index.php/CEGUI_In_Practice_-_Managing_input

            CEGUI 實(shí)踐3

            再次歡迎回來!我們將通過這篇教程學(xué)會(huì)如何在運(yùn)行時(shí)與CEGUI 系統(tǒng)交互--圖形用戶接口最重要的特性!

            CEGUI 被設(shè)計(jì)用于許多系統(tǒng),支持不同的渲染器。鑒于此,它沒有與特定的輸入系統(tǒng)綁定。然而對于演示如何與CEGUI 交互,我們必須選擇一種輸入系統(tǒng)來使用,不是嗎?因此,我決定采用OIS [1] 。盡管我一直嘗試保持OIS 特定功能和結(jié)構(gòu)的分離,在一些依賴特定平臺(tái)的地方還是會(huì)引用到我們使用的系統(tǒng)。

            輸入注入

            首先,應(yīng)當(dāng)意識(shí)到在CEGUI 中處理用戶輸入動(dòng)作很簡單,這毫無疑問。當(dāng)一個(gè)動(dòng)作發(fā)生時(shí)(用戶輸入,敲擊Esc 鍵退出,點(diǎn)擊按鈕),CEGUI 需要接到通知。

            CEGUI::System::injectKeyDown(uint key_code); // Tells CEGUI Key has been Pressed
            CEGUI::System::injectKeyUp(uint key_code); // Tells CEGUI Key has been Released
            CEGUI::System::injectChar(utf32 code_point);

            Inject keydown/up 一般用于發(fā)送Shift ,控制,回車鍵等,而injectChar 從字面理解是注入一個(gè)字符。

            鼠標(biāo)采用類似的處理方式,下面的代碼展示了如何通知CEGUI 鼠標(biāo)左鍵按下動(dòng)作:

            CEGUI::System::injectMouseButtonDown(CEGUI::MouseButton::LeftButton);

            如你所想,應(yīng)該會(huì)有injectMouseButtonUp() 通知CEGUI 鼠標(biāo)松開。

            鼠標(biāo)移動(dòng)時(shí)又會(huì)如何呢?當(dāng)然會(huì)考慮到:

            CEGUI::System::injectMouseMove(float delta_x, float delta_y);

            delta 是自上次CEGUI 更新后鼠標(biāo)在屏幕移動(dòng)的像素。

            截至目前為止,我們尚未給CEGUI 任何處理時(shí)間。如果我們正在移動(dòng)鼠標(biāo)或者點(diǎn)擊按鈕,我們想要CEGUI 顯示動(dòng)作的反饋,因此需要告訴CEGUI 自上次渲染后經(jīng)歷的時(shí)間。

            CEGUI::System::injectTimePulse(float timeElapsed);

            我們用經(jīng)過的秒數(shù)來注入一次時(shí)間脈沖。更新CEGUI 的頻率取決于個(gè)人,然而多數(shù)游戲都會(huì)在每次更新周期中同步的注入時(shí)間脈沖來更新GUI 。如果你正在構(gòu)建的只是一個(gè)工具應(yīng)用,頻繁的更新可能沒有必要。

            繼續(xù)前行!

            我假定大家正在使用OIS 且知道如何使用它。有2個(gè)函數(shù)允許你與CEGUI 交互。下面的函數(shù)傳遞輸入按鍵,注入鍵盤按下、彈起動(dòng)作(鍵碼)以及相關(guān)的按鍵字符:

            void InjectOISKey(bool bButtonDown, OIS::KeyEvent inKey){
                    if (bButtonDown)
                    {
                            CEGUI::System::getSingleton().injectKeyDown(inKey.key);
                            CEGUI::System::getSingleton().injectChar(inKey.text);
                    }
                    else
                    {
                            CEGUI::System::getSingleton().injectKeyUp(inKey.key);
                    }}

            下面的函數(shù)處理OIS 的鼠標(biāo)按鍵按下和彈起動(dòng)作:

            void InjectOISMouseButton(bool bButtonDown, OIS::MouseButtonID inButton){
                    if (bButtonDown == true)
                    {
                            switch (inButton)
                            {
                            case OIS::MB_Left:
                                    CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton);
                                    break;
                            case OIS::MB_Middle:
                                    CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);
                                    break;
                            case OIS::MB_Right:
                                    CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);
                                    break;
                            case OIS::MB_Button3:
                                    CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::X1Button);
                                    break;
                            case OIS::MB_Button4:
                                    CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::X2Button);
                                    break;
                            default:    
                                    break;
                            }
                    }
                    else // bButtonDown = false
                    {
                            switch (inButton)
                            {
                            case OIS::MB_Left:
                                    CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton);
                                    break;
                            case OIS::MB_Middle:
                                    CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton);
                                    break;
                            case OIS::MB_Right:
                                    CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);
                                    break;
                            case OIS::MB_Button3:
                                    CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::X1Button);
                                    break;
                            case OIS::MB_Button4:
                                    CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::X2Button);
                                    break;
                            default:    
                                    break;
                            }
                    }
            }

            上面的函數(shù)會(huì)把OIS 鼠標(biāo)輸入轉(zhuǎn)換到CEGUI 的。目前來講這段代碼是正確的,如果它們有變動(dòng)的話,我將會(huì)提供一個(gè)示例講解如何在CEGUI 中使用OIS。


            總結(jié)

            本篇教程有點(diǎn)短小,但它提供了如何與CEGUI 交互的信息。下一篇教程將講解如何真正的處理按鍵來實(shí)現(xiàn)一些有趣的事情。敬請期待!


            CEGUI 實(shí)踐4:下壓按鈕(PushButton)

            創(chuàng)建于:2012-5-7 14:19
            更新時(shí)間:2012-5-8 17:28
            來源:http://www.cegui.org.uk/wiki/index.php/CEGUI_In_Practice_-_A_push_button

            CEGUI 實(shí)踐4

            嗨,嗨,通過前幾節(jié)教程你已經(jīng)有了很大進(jìn)步!嗯,上一節(jié)我們簡單的看了一下如何發(fā)送輸入給CEGUI 。這非常有用,因?yàn)槲覀兘裉齑蛩阒谱饕粋€(gè)按鈕。一個(gè)能觸發(fā)事件的按鈕!我知道,這令人興奮。

            一些基礎(chǔ)工作

            首先我們需要了解CEGUI 如何處理事件。

            CEGUI 是基于事件/訂閱方式來實(shí)現(xiàn)的。這意味著一些部件(按鈕,編輯框,列表框)會(huì)觸發(fā)事件(鼠標(biāo)點(diǎn)擊,接收文本,選擇),其它對象(類對象,其它CEGUI 部件等)能夠接收通知,通過下面的方法訂閱事件:

            CEGUI::Window::subscribeEvent(const String& name,Event::Subscriber subscriber)

            第一個(gè)參數(shù)是希望訂閱的事件名,都是靜態(tài)常量字符串。你可以在CEGUI的各種Widget對應(yīng)的頭文件中找到這些事件,比如CEGUIPushButton 包含CEGUI::PushButton::EventClicked 。

            第二個(gè)參數(shù)是事件觸發(fā)時(shí)被調(diào)用的訂閱者。

            這里給出一個(gè)例子,演示如何注冊一個(gè)在按鈕點(diǎn)擊時(shí)進(jìn)行跳躍的對象。首先創(chuàng)建這個(gè)能觸發(fā)對象跳躍的按鈕,例子中使用全局變量只是為了簡單起見,盡管是非常糟糕的編碼風(fēng)格:

            CEGUI::Window *gJumpBtnWindow = NULL;
            void CreateJumpButton(){
              gJumpBtnWindow = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button","JumpPushButton");  // Create Window
              gJumpBtnWindow->setPosition(CEGUI::UVector2(CEGUI::UDim(0.75,0),CEGUI::UDim(0.50,0)));
              gJumpBtnWindow->setSize(CEGUI::UVector2(CEGUI::UDim(0,50),CEGUI::UDim(0,50)));
              gJumpBtnWindow->setText("Jump!");
              CEGUI::System::getSingleton().getGUISheet()->addChildWindow(gJumpBtnWindow);  
            }

            上面代碼創(chuàng)建的按鈕是"TaharezLook/Button" 類型,存在于.scheme 文件中。接著設(shè)置按鈕名字為"JumpPushButton" 并設(shè)置大小和位置,之后添加到GUI 的root 窗口中。這是對第一、二節(jié)教材的溫習(xí),但setText 是新內(nèi)容。我想望文生義也能知道這個(gè)方法是設(shè)置窗口文本。PushButton ,EditBoxes ,F(xiàn)rameWindow 等都可通過它來設(shè)置顯示文本。

            創(chuàng)建好按鈕之后,新建一個(gè)類來接受這個(gè)按鈕的事件。請注意這只是一個(gè)示例,你自己的應(yīng)用程序中很可能不會(huì)這么簡單!

            class OurPlayer
            {
               public:
                OurPlayer()
                {
                 RegisterForEvents();   // Call our Register function
                };
                bool Jump(const CEGUI::EventArgs& /*e*/){};        // Jump for joy
               private:
                RegisterForEvents()
                {
                   gJumpBtnWindow->subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&OurPlayer::Jump,this));
                };}

            嗯,這是一個(gè)很小的類,不是嗎?我不知道你打算如何讓對象跳躍,所以你得自己填充那些內(nèi)容。我只是想演示如何與GUI 交互!

            嗯,真正有有意義的是RegisterForEvents() 函數(shù)。你之前在其它應(yīng)用中可能沒有這樣處理過事件訂閱,所以我簡單的來介紹一下。

            一般來講,它們通過創(chuàng)建一個(gè)結(jié)構(gòu)體提供給CEGUI ,帶有調(diào)用函數(shù)以及該函數(shù)的對象實(shí)例。第一個(gè)參數(shù)&OurPlayer::Jump 表明使用OurPlayer 的成員函數(shù)Jump 。問題是我們無法知道該使用哪個(gè)OurPlayer ?假如屏幕被一分為二,左右各一個(gè)OurPlayer 該怎么辦?所以指定一個(gè)OurPlayer ,這就是第二個(gè)參數(shù)。在C++ 里,this 返回當(dāng)前對象指針,因此事件的訂閱者就是調(diào)用RegisterForEvents() 函數(shù)的類對象。

            如果我們這樣創(chuàng)建:

            OurPlayer *leftPlayer;
            OurPlayer *rightPlayer;

            那么可以這樣調(diào)用調(diào)用函數(shù):

            gJumpBtnWindow->subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&OurPlayer::Jump,leftPlayer));

            可以看出有多種使用方式。還有一些其它的事件:

            • MouseClicked,
            • MouseEnters,
            • MouseLeaves,
            • EventActivated,
            • EventTextChanged,
            • EventAlphaChanged,
            • EventSized

            這里只列出了一些,所有窗口都繼承的事件列表很大,在CEGUIWindow.h 中。

            總結(jié)

            希望本篇教程使你明白如何在CEGUI 中實(shí)現(xiàn)事件。這是一種通用機(jī)制,一旦掌握了如何使用事件,GUI 其余的東西就變得簡單了,因?yàn)榇蟛糠钟脩艚换ザ际鞘录?qū)動(dòng)的。甚至還有窗口的旋轉(zhuǎn)和拖放事件,盡管你現(xiàn)在可能不會(huì)全部都用到。只有想不到,沒有做不到!下一篇再見!

            posted on 2012-05-16 17:09 萬連文 閱讀(3406) 評論(1)  編輯 收藏 引用

            FeedBack:
            # re: CEGUI0.7 實(shí)踐
            2012-06-05 17:38 | 七星重劍
            你真有激情啊  回復(fù)  更多評論
              
            簡歷下載
            聯(lián)系我

            <2012年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久久久久一区二区三区 | 亚洲欧洲久久av| 久久综合久久鬼色| 久久婷婷五月综合国产尤物app| 久久久久久久精品妇女99| 国产精品久久久久aaaa| 久久免费大片| 精品久久久久久国产| 久久精品国产精品亚洲人人| 日韩人妻无码一区二区三区久久| 欧美一区二区三区久久综合| 国产精品成人久久久久久久| 久久久无码精品亚洲日韩京东传媒| 好久久免费视频高清| 中文字幕久久亚洲一区| 久久99国产亚洲高清观看首页| 色偷偷91久久综合噜噜噜噜| 国产午夜精品久久久久免费视 | 久久99九九国产免费看小说| 无码国内精品久久人妻| 久久人人超碰精品CAOPOREN| 久久无码人妻一区二区三区| 久久久高清免费视频| 91久久精品电影| 粉嫩小泬无遮挡久久久久久 | 成人久久精品一区二区三区| 一本色道久久88综合日韩精品 | 久久影院综合精品| 中文字幕精品无码久久久久久3D日动漫 | 亚洲精品NV久久久久久久久久 | 一级做a爱片久久毛片| 日产精品久久久久久久| 久久综合久久综合亚洲| 久久久久亚洲AV成人网人人软件| 色偷偷久久一区二区三区| 亚洲欧洲中文日韩久久AV乱码| 亚洲国产成人久久综合碰碰动漫3d | 色99久久久久高潮综合影院| 91超碰碰碰碰久久久久久综合| 四虎国产精品免费久久5151 | 久久精品无码一区二区三区日韩|