青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

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


CEGUI 實踐1:入門

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

CEGUI 實踐1

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

【請注意,我是一名Ogre3d 使用者,所以初始化設置是從如何引導并啟動Ogre3d 開始?!?/p>

介紹CEGUI

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

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

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

CEGUI::FontManager - 管理應用程序中用到的不同字體。

開始

我們從一些設置工作開始,第一件要做的事情就是建立系統并使其跑起來。因為我是一名Ogre 使用者,所以用Ogre 來構建可運行的系統。還有多種以其它渲染系統來啟動的方法,參見這里:The Beginner Guide to Getting CEGUI Rendering 。

Ogre3d 方式演示如下:

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


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


【注意:bootstrapSystem 是一個比較新的方法,在CEGUI 0.7.1 中才引入。Wiki 上的一些例子還在使用舊版本的CEGUI ,你需要確認自己正在使用的版本?!?/p>

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

還有一點值得一提的是bootstrapSystem() 會創建一個CEGUI::System 實例。這一點很重要,因為如果你已經創建過CEGUI::System ,這里就會拋出一個異常。

呃,來點腳本文件

上面我們就只調用了那一個函數,在進行更多CEGUI 處理之前,我們需要了解一些基礎知識。

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

<?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 格式的文件,用于定義顯示在屏幕上的窗口的布局。比如想創建一個聊天窗口,我們可能需要一個ChatWindow.layout 文件存放在某個地方。它應該描述窗口外觀(大小,屏幕位置等),輸入框和發送消息按鈕的擺放位置。下面是一個演示.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 中用到的字體,下面是一個例子:

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

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

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

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

接著開始部分

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

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

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


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

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

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


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

嗯,現在CEGUI 清楚了我們想使用的一些缺省設置。我們創建一個根窗口,作為其它一切窗口的載體。

CEGUI 采用父/子關系來組織窗口,所以第一要務是創建所有其它窗口的父窗口:

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


上面WindowManager 單件的函數調用創建一個"DefaultWindow" 類型名為"_MasterRoot" 的窗口。這個缺省窗口就是根窗口。缺省窗口是空的(或者說透明的)。根窗口的名字是隨意指定的,然而我個人喜歡用_MasterRoot ,因為我的其它窗口一般不會用這個名字。

窗口創建后,需要設置它為根窗口:

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


系統對象的函數調用,把
myRoot 作為缺省窗口。記住上面myRoot 創建時起的名字"_MasterRoot" 。

總結

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


CEGUI 實踐2:創建部件(Widgets)

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

CEGUI 實踐2

歡迎回來,這是CEGUI 實踐系列教程第二篇。本篇在前一篇教程CEGUI 實踐 - 入門的基礎上構建,演示如何創建部件并管理它們。

部件

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

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


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

【注意:需要提醒的是,窗口名不是強制必須的,但需要避免名字重復。一些用戶傾向于采用類似ParentName/ChildName 的命名習慣,例如"ConsoleWindow/SendButton" 或"_MasterRoot/HealthBar" ?!?/p>

窗口一旦創建,myImageWindow 即指向一個派生于CEGUI::Window 的CEGUI::DefaultWindow 窗口。通過查看.scheme文件你會發現部件的派生關系是通過TargetType=tag 指出的。

接下來我們需要為窗口設置一些屬性??梢酝ㄟ^屬性集來做到,或者通過函數調用。后一種方式多少有點不爽,因為你可能需要強制轉換到正確的窗口類型以訪問其成員函數,但可能更加直觀一些。

統一度量系統

我們創建好部件之后,現在需要把它擺放到某個位置并指定大小。通過代碼方式實現,OK 不?

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

CEGUI::UDim(scale,offset);


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

屏幕上的點(UVector2)由兩個UDim 組成:

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


同理,CEGUI::Rect由四個UDim 組成:

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


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

部件演練

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


看上去可能有點丑,分開來看吧。setPosition接收一個UVector2 參數 ,每個UVector2 由X 和 Y Udim 組成,每個Udim 又是由比率和絕對浮點數構成。

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


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


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


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

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


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

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

窗口創建完成之后,需要添加到當前的根窗口中:

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


這樣窗口就會顯示出來.

總結

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


CEGUI 實踐3:管理輸入

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

CEGUI 實踐3

再次歡迎回來!我們將通過這篇教程學會如何在運行時與CEGUI 系統交互--圖形用戶接口最重要的特性!

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

輸入注入

首先,應當意識到在CEGUI 中處理用戶輸入動作很簡單,這毫無疑問。當一個動作發生時(用戶輸入,敲擊Esc 鍵退出,點擊按鈕),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 一般用于發送Shift ,控制,回車鍵等,而injectChar 從字面理解是注入一個字符。

鼠標采用類似的處理方式,下面的代碼展示了如何通知CEGUI 鼠標左鍵按下動作:

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

如你所想,應該會有injectMouseButtonUp() 通知CEGUI 鼠標松開。

鼠標移動時又會如何呢?當然會考慮到:

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

delta 是自上次CEGUI 更新后鼠標在屏幕移動的像素。

截至目前為止,我們尚未給CEGUI 任何處理時間。如果我們正在移動鼠標或者點擊按鈕,我們想要CEGUI 顯示動作的反饋,因此需要告訴CEGUI 自上次渲染后經歷的時間。

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

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

繼續前行!

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

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);
        }}

下面的函數處理OIS 的鼠標按鍵按下和彈起動作:

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;
                }
        }
}

上面的函數會把OIS 鼠標輸入轉換到CEGUI 的。目前來講這段代碼是正確的,如果它們有變動的話,我將會提供一個示例講解如何在CEGUI 中使用OIS。


總結

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


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

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

CEGUI 實踐4

嗨,嗨,通過前幾節教程你已經有了很大進步!嗯,上一節我們簡單的看了一下如何發送輸入給CEGUI 。這非常有用,因為我們今天打算制作一個按鈕。一個能觸發事件的按鈕!我知道,這令人興奮。

一些基礎工作

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

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

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

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

第二個參數是事件觸發時被調用的訂閱者。

這里給出一個例子,演示如何注冊一個在按鈕點擊時進行跳躍的對象。首先創建這個能觸發對象跳躍的按鈕,例子中使用全局變量只是為了簡單起見,盡管是非常糟糕的編碼風格:

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);  
}

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

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

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));
    };}

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

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

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

如果我們這樣創建:

OurPlayer *leftPlayer;
OurPlayer *rightPlayer;

那么可以這樣調用調用函數:

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

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

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

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

總結

希望本篇教程使你明白如何在CEGUI 中實現事件。這是一種通用機制,一旦掌握了如何使用事件,GUI 其余的東西就變得簡單了,因為大部分用戶交互都是事件驅動的。甚至還有窗口的旋轉和拖放事件,盡管你現在可能不會全部都用到。只有想不到,沒有做不到!下一篇再見!

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

FeedBack:
# re: CEGUI0.7 實踐
2012-06-05 17:38 | 七星重劍
你真有激情啊  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


簡歷下載
聯系我

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            乱中年女人伦av一区二区| 国产精品国产三级国产aⅴ浪潮| 久久视频在线免费观看| 美女尤物久久精品| 蜜桃av综合| 欧美日韩国产三级| 国产日本欧美一区二区三区| 亚洲国产综合91精品麻豆| 亚洲免费影视第一页| 久久国产一区二区| 欧美电影电视剧在线观看| 9色国产精品| 性色av一区二区三区| 久久久久女教师免费一区| 欧美激情视频一区二区三区免费 | 亚洲精品裸体| 日韩一区二区精品在线观看| 亚洲人在线视频| 欧美亚洲一区三区| 欧美国产一区二区| 在线亚洲电影| 亚洲少妇诱惑| 久久综合色88| 亚洲电影网站| 久久亚洲图片| 日韩午夜三级在线| 午夜在线电影亚洲一区| 欧美精品一区三区| 国产精品一区免费视频| 亚洲三级影院| 久久久青草青青国产亚洲免观| 亚洲国产一区二区a毛片| 亚洲一区二区三区中文字幕| 久久久国际精品| 国产精品亚洲成人| 亚洲日本欧美日韩高观看| 欧美亚洲网站| 亚洲欧美中文字幕| 亚洲精品乱码久久久久久| 久久精品二区三区| 国产精品免费视频xxxx| 日韩系列在线| 免费在线日韩av| 午夜精品一区二区三区电影天堂 | 亚洲国产精品va在线看黑人| 亚洲欧美一区二区在线观看| 欧美1区免费| 狠狠狠色丁香婷婷综合激情| 亚洲一区二区三区高清不卡| 欧美国产精品一区| 性久久久久久久| 国产精品国产三级国产专播品爱网 | 欧美成人69av| 午夜精品区一区二区三| 欧美日韩国产综合在线| 在线观看日韩一区| 亚洲女人小视频在线观看| 美女精品网站| 久久精品在线免费观看| 欧美精品18+| 免费亚洲电影| 在线看视频不卡| 国模私拍一区二区三区| 欧美一区二区视频免费观看| 欧美一区二区三区视频免费播放 | 国产欧美日韩三级| 一本色道久久综合亚洲精品高清| 美玉足脚交一区二区三区图片| 亚洲欧美国产va在线影院| 欧美日一区二区在线观看 | 欧美日韩亚洲系列| 亚洲麻豆一区| 亚洲国产精品一区二区久| 久久综合给合| 亚洲第一在线综合网站| 美女黄毛**国产精品啪啪| 久久久.com| 韩日欧美一区| 久久青青草综合| 欧美在线你懂的| 伊人精品视频| 亚洲国产精品久久人人爱蜜臀| 欧美国产三级| 亚洲私人影院在线观看| 亚洲一区在线播放| 国产一区二区中文| 欧美国产免费| 欧美日韩视频在线第一区| 亚洲欧美清纯在线制服| 校园春色国产精品| 亚洲成人资源| 亚洲久久成人| 国产欧美日韩不卡| 嫩草伊人久久精品少妇av杨幂| 免费欧美高清视频| 亚洲图色在线| 欧美一区激情| 亚洲另类一区二区| 亚洲一区二区在线看| 国产亚洲精品aa| 欧美激情精品久久久久久大尺度| 欧美日韩视频| 久久精品理论片| 欧美国产欧美综合 | 亚洲主播在线播放| 樱桃视频在线观看一区| 亚洲欧洲三级电影| 国产欧美一区二区精品仙草咪| 免费成人高清视频| 欧美午夜激情在线| 新67194成人永久网站| 久久久之久亚州精品露出| 99国产精品久久久久老师| 午夜精品区一区二区三| 亚洲精品人人| 亚久久调教视频| 日韩系列欧美系列| 欧美淫片网站| 一区二区精品| 久久久久国产一区二区三区四区| 中文av一区特黄| 久久久人成影片一区二区三区| 一区二区三区www| 亚洲麻豆av| 亚洲国产成人午夜在线一区 | 狠狠综合久久av一区二区小说| 一本色道久久| 欧美一区二区精美| 最新日韩av| 亚洲欧美日韩另类| 亚洲精品一区在线观看| 亚洲欧美日韩精品在线| 亚洲精品久久久一区二区三区| 亚洲欧美日产图| 99精品99| 久久婷婷综合激情| 欧美亚洲一区在线| 欧美日韩精品二区| 欧美a级一区| 国产一级精品aaaaa看| 日韩一二三在线视频播| 亚洲国产高清高潮精品美女| 亚洲一区二区在线看| 一区二区三区高清视频在线观看| 久久久精品一区二区三区| 亚欧成人在线| 欧美日韩一区在线观看| 欧美激情亚洲国产| 加勒比av一区二区| 午夜日韩在线观看| 亚洲素人在线| 欧美激情综合在线| 欧美激情第五页| 一色屋精品视频免费看| 午夜亚洲一区| 校园激情久久| 国产精品美女一区二区| 亚洲乱码国产乱码精品精98午夜| 亚洲国产日韩在线一区模特| 久久99在线观看| 久久国产日韩| 国产精品爽黄69| 亚洲无线观看| 亚洲一区二三| 国产精品videossex久久发布| 亚洲欧洲三级电影| 亚洲精选中文字幕| 欧美成人午夜激情在线| 欧美成人日韩| 亚洲韩国一区二区三区| 久久视频国产精品免费视频在线 | 久久久久久自在自线| 国产精品亚发布| 亚洲综合99| 欧美一区2区视频在线观看| 国产精品jizz在线观看美国| 日韩午夜三级在线| 亚洲永久免费视频| 国产精品亚洲一区| 亚洲综合成人婷婷小说| 欧美在线3区| 国产视频一区在线观看| 午夜精品在线观看| 久久久久久国产精品一区| 国产主播一区二区三区| 久久久综合激的五月天| 欧美激情视频在线播放| 日韩午夜av| 国产精品v日韩精品v欧美精品网站| 日韩香蕉视频| 午夜伦理片一区| 国产亚洲免费的视频看| 久久久精品性| 91久久精品www人人做人人爽| 99国产精品久久久久久久| 欧美性理论片在线观看片免费| 亚洲主播在线观看| 老司机午夜免费精品视频| 亚洲国产精品久久久久秋霞影院| 欧美大片在线看|