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)擊,窗口拖拽,輸入等等!謝謝閱讀!