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

麒麟子

~~

導航

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

HGE中的游戲GUI代碼閱讀

作者 : Kevin Lynx
BLOG: http://blog.csdn.net/kevinlynx


第一部分:

HGE helper類中的GUI:

引擎版本:1.60release。



文件:hgegui.h , hgegui.cpp, hgeguictrls.h , hgeguictrls.cpp

大致類圖:



其中,hgeGUIObject是抽象基類,具體的控件類如按鈕,文本標簽,都是從它派生而來。HgeGUI屬于整個GUI系統的manager,它會保存所有的控件。

關于hgeGUIObject的8個成員變量,文檔里已經有所描述:

int id; //控件ID

bool bStatic; //是否可以接受鍵盤焦點

bool bVisible; //是否可見

bool bEnabled; //是否有效

hgeRect rect; //控件大小



hgeGUI *gui; //其屬于的 manager ,相當于父對象

hgeGUIObject *next; //用于雙向鏈表,把所有控件連接在一起

hgeGUIObject *prev;

static HGE *hge; //方便使用HGE接口

關于其部分接口的描述:

Render: 用于渲染控件到屏幕上

Update: 用于更新其動畫

Enter: 控件剛顯示時的動畫

Leave: 控件要消失時的動畫

IsDone: 控件剛顯示和消失時的狀態查詢函數



該類也就是提供了一個抽象而已,利用C++語言的多態機制來方便hgeGUI管理所有的控件。其他具體的控件繼承了hgeGUIObject后,必須實現構造函數和Render函數。



關于hgeGUI:

這個類應該屬于manager。它負責管理所有的控件。

其數據成員:

hgeGUIObject *ctrls; //保存所有控件

hgeGUIObject *ctrlLock; //可能是用來保存當前被鼠標操作的控件

hgeGUIObject *ctrlFocus; //保存焦點控件

hgeGUIObject *ctrlOver; //用來保存鼠標指針所指的控件



int navmode;

int nEnterLeave;

hgeSprite *sprCursor; //渲染鼠標指針用的



float mx,my; //鼠標坐標

int nWheel; //滾輪偏移量

bool bLPressed, bLLastPressed;//本幀左鍵狀態,上一幀的左鍵狀態

bool bRPressed, bRLastPressed;

其Update方法會負責控件的進入和離開動畫,還會負責整體的狀態設置---哪些控件擁有焦點,哪些控件被鼠標正在操作,哪些控件正被鼠標指針指著,這些控件它都會保存起來。(也就是說,我們還是可以通過檢查控件的狀態來設置當鼠標指針在其上時的新動畫。)



總體而言,該引擎的GUI還是很簡單的。一個manager,負責管理所有的控件,然后一個抽象基類,用來協助manager管理---其他具體的控件都必須從那個抽象基類派生。



下面具體看一個Button控件:

Button類的定義如下:

class hgeGUIButton : public hgeGUIObject

{

public:

hgeGUIButton(int id, float x, float y, float w, float h, HTEXTURE tex, float tx, float ty);

virtual ~hgeGUIButton();



void SetMode(bool _bTrigger) { bTrigger=_bTrigger; }

void SetState(bool _bPressed) { bPressed=_bPressed; }

bool GetState() const { return bPressed; }



virtual void Render();

virtual bool MouseLButton(bool bDown);



private:

bool bTrigger;

bool bPressed;

bool bOldState;

hgeSprite *sprUp, *sprDown;

};

其中bTrigger表示該按鈕的行為是否象一個RadioButton,bPressed表示當前按鈕是否被按下,bOldState表示上一次按鈕狀態,特別用來實現bTrigger的,sprUp,sprDown分別用來繪制彈起和按下時的按鈕外觀。這兩個精靈的創建都是從構造函數的tex上創建而來的,它要求兩個狀態必須保存在一幅紋理上,且順序為從左至右。

按鈕的實現代碼也很簡單:

void hgeGUIButton::Render()

{

if(bPressed) sprDown->Render(rect.x1, rect.y1);

else sprUp->Render(rect.x1, rect.y1);

}



bool hgeGUIButton::MouseLButton(bool bDown)

{

if(bDown)

{

bOldState=bPressed; bPressed=true;

return false;

}

else

{

if(bTrigger) bPressed=!bOldState;

else bPressed=false;

return true;

}

}



聯系起來,當hgeGUI::Update里處理ProcessCtrl時,如果鼠標左鍵按下且其指針在按鈕范圍內,那么就調用hgeGUIButton::MouseLButton( true ),這個時候button的bPressed=true,那么在渲染的時候,自然就表現出被按下時的狀態。

事實上對于這種類型的按鈕---如同windows下的窗體按鈕,我們一般不檢查其是否被按下,而是檢查其是否發生了clicked 這個事件,而這個事件是在先按下在彈起的情況下發生的。因此,判斷該事件發生的條件就為:上一幀狀態被按下,這一幀沒被按下。



雖然HGE引擎的GUI很簡單,但是其擴展性很好。因為hgeGUI::Update基本上派發了所有控件需要的消息---鍵盤操作,以及鼠標操作;而hgeGUIObject基類的很多成員函數都會處理這些消息,我們只需要派生hgeGUIObject,然后重載我們需要的消息處理即可。

第二部分:

HGE擴展GUI庫,從HGE官方論壇下載(作者不明):

工程結構:



其中,guitest.cpp為測試文件。



類結構:



整個系統的工作原理:

用戶繼承抽象基類GUIApp,實現具體的OnEvent函數,然后該類會管理所有的GUIAppWindow對象,GUIAppWindow窗口對象會管理其上的所有子控件。



相應地,GUIApp派生類會直接得到鼠標和鍵盤消息,然后派發給所有窗口對象,然后窗口對象再把消息派發到具體的控件對象上。



這種Parent-Child關系大致為:


GUIAppWindow類保存有其所屬的GUIApp對象指針,每個具體的控件又保存有其所屬的GUIAppWindow 的對象指針。



當一個控件處理了某個事件后,例如按鈕處理了鼠標單擊事件,它就需要告訴外界用戶單擊了這個按鈕。這里采用的方法是:在基類GUIAppObject里定義了一個虛函數OnEvent( int id)

,然后在其派生類GUIAppWindow里把這個函數重載為純虛函數,函數有一個參數,那就是控件ID。當一個控件處理了某個事件后,就通過其內部保存的父窗口指針來調用OnEvent函數,然后GUIAppWindow的派生類---如果該類能產生對象,那么其必然實現了OnEvent的具體代碼(這就是為什么在GUIAppWindow里要把OnEvent又重載為純虛函數的原因),然后在此代碼里,窗口根據傳進來的控件ID來得知哪個控件發生了事件!



GUIAppWindow里有一個容器,它保存了所有該窗口上的控件。



所有控件再創建時,都是以其父窗口為參考坐標系的,也就是相對坐標,但是其實際保存的坐標卻是絕對坐標—既相對于整個屏幕的坐標(如果是窗口程序,就相對于整個窗口)。大致過程為:在GUIAppWindow派生類中創建子控件時,給子控件指定的坐標為相對坐標,然后當 AddCtrl 時就會重新把子控件的坐標改變為絕對坐標。



GUIApp里直接有了BeginScene和EndScene的渲染代碼。



要使用該擴展庫,大致步驟為:

1. 繼承GUIAppWindow類,在這個派生類里重載具體的處理OnEvent的函數,并創建所有該窗口上的子控件。

2. 繼承GUIApp類,在這個派生類中創建窗口對象,并把窗口對象AddCtrl,在這里可以進行其他的初始化工作

3. 在FrameFunc里調用GUIApp::FrameFunc函數。



總體而言,這個擴展GUI主要是擴展了GUI Manager以及GUI Object,并且加入了Parent-Child機制。比較經典的部分在于提供了一個 OnEvent 函數,這樣就可以讓客戶程序員能夠得知窗體上的控件發生的事件。 ----其實這種方法的目的就跟Windows中的消息機制,Qt中的signal/slot機制一樣。

posted on 2009-05-18 12:47 麒麟子 閱讀(1527) 評論(0)  編輯 收藏 引用 所屬分類: Game and Engine

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲精品中文字幕在线| 亚洲精品视频在线播放| 欧美看片网站| 国产精品久久久久91| 国产九九精品| 亚洲第一在线视频| 一区二区三区免费观看| 亚洲伦伦在线| 国产精品日韩精品欧美精品| 红杏aⅴ成人免费视频| 日韩视频中文字幕| 久久国产精品久久精品国产| 欧美国产精品中文字幕| 亚洲图片欧美一区| 欧美国产精品一区| 国产欧美一区二区精品秋霞影院| 亚洲电影下载| 亚洲毛片av| 国产日韩一区| 午夜日本精品| 欧美大成色www永久网站婷| 欧美精品免费视频| 亚洲国产精品高清久久久| 亚洲欧美在线高清| 久久久欧美一区二区| 欧美三级午夜理伦三级中文幕| 国产一区二区在线观看免费播放| 亚洲图片欧美午夜| 亚洲高清网站| 久久久久一区二区| 亚洲免费观看| 欧美人成在线| 免费美女久久99| 国产精品亚洲网站| 亚洲福利久久| 国产伪娘ts一区| 99精品久久久| 欧美日韩一区二区视频在线观看| 日韩亚洲欧美成人| 久久久久久久综合色一本| 亚洲在线观看免费| 中文久久乱码一区二区| 亚洲国产第一页| 欧美亚洲专区| 黑人一区二区| 在线中文字幕不卡| 亚洲精品资源美女情侣酒店| 欧美成人精品在线播放| 国产精品永久| 一区二区高清视频| 国产精品美女在线| 久久精品99国产精品日本| 久久国产婷婷国产香蕉| 伊人激情综合| 亚洲激情一区| 欧美网站在线| 久久精品噜噜噜成人av农村| 国产精品av久久久久久麻豆网| 亚洲国产精品热久久| 国产精品福利在线| 亚洲乱码日产精品bd| 亚洲日本va午夜在线电影| 日韩视频在线一区二区三区| 亚洲成色999久久网站| 欧美一区二区三区在线观看| 久久爱另类一区二区小说| 国产精品久久久| 亚洲欧美另类综合偷拍| 国外成人在线视频| 欧美专区18| 99精品视频免费观看视频| 欧美国产精品劲爆| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久久久久五月尺| 一区二区不卡在线视频 午夜欧美不卡' | 91久久一区二区| 久久综合九色综合欧美狠狠| 日韩视频免费观看| 欧美日韩精品一区视频| 久久久精品性| 欧美日韩mv| 亚洲最新视频在线| 欧美一区二区三区免费在线看| 久久久噜噜噜久久人人看| 玖玖玖国产精品| 国产精品久久久久久久9999| 亚洲欧美日韩在线高清直播| 亚洲国产美国国产综合一区二区| 亚洲视频在线观看免费| 欧美在线二区| 激情视频一区| 亚洲欧美综合精品久久成人 | 国产欧美一区二区三区沐欲 | 亚洲社区在线观看| 欧美亚洲一区二区在线| 欧美.日韩.国产.一区.二区| 欧美一级二级三级蜜桃| 伊人成人开心激情综合网| 欧美精品www| 亚洲午夜在线观看视频在线| 欧美在线观看视频在线| 91久久夜色精品国产九色| 欧美视频网址| 久久一区中文字幕| 久久免费视频网| 亚洲乱码国产乱码精品精可以看| 国产精品久久久久久久久久久久| 久久精品五月婷婷| 久久九九国产精品| 亚洲人成在线观看网站高清| 国产精品家教| 免费欧美在线| 亚洲永久免费视频| 午夜天堂精品久久久久| 一区二区视频免费完整版观看| 欧美精品一区二区三区很污很色的| 亚洲香蕉在线观看| 亚洲三级网站| 欧美成人小视频| 久久久xxx| 亚洲欧美中文另类| 日韩亚洲欧美在线观看| 一区二区在线观看av| 国产精品美女久久| 欧美经典一区二区三区| 久久人人爽爽爽人久久久| 亚洲综合色噜噜狠狠| 99re视频这里只有精品| 91久久精品一区二区别| 农村妇女精品| 美女免费视频一区| 久久综合99re88久久爱| 在线观看日韩www视频免费| 国产精品视频xxxx| 欧美午夜宅男影院| 欧美日韩一区二区三区在线观看免| 欧美成人在线网站| 看片网站欧美日韩| 久久综合久久美利坚合众国| 久久aⅴ国产紧身牛仔裤| 欧美一激情一区二区三区| 亚洲免费视频成人| 亚洲欧美激情视频| 亚洲欧美日韩精品久久久久| 亚洲婷婷综合色高清在线 | 午夜久久99| 亚洲香蕉伊综合在人在线视看| 国产精品女主播| 国产精品国产三级国产专播品爱网| 欧美日韩1区2区| 欧美色一级片| 国产精品日韩欧美一区| 国产欧美日韩亚洲一区二区三区 | 美日韩丰满少妇在线观看| 亚洲乱亚洲高清| 夜夜爽99久久国产综合精品女不卡| 亚洲精品一区二区三区四区高清| 亚洲电影第1页| 亚洲精品乱码久久久久久| 日韩视频永久免费| 亚洲视频在线看| 久久精品国产亚洲一区二区| 理论片一区二区在线| 欧美日韩精品是欧美日韩精品| 欧美三日本三级三级在线播放| 国产精品久线观看视频| 韩国av一区| 亚洲精品一二三区| 伊人激情综合| 一本色道久久加勒比精品| 在线观看日韩www视频免费 | 国产精品亚洲一区| 一区二区三区在线视频免费观看| 亚洲激情在线观看| 亚洲一区成人| 免费视频一区二区三区在线观看| 最新日韩中文字幕| 香蕉视频成人在线观看| 亚洲美女视频在线观看| 亚洲女爱视频在线| 免费观看不卡av| 国产精品男gay被猛男狂揉视频| 国精产品99永久一区一区| 国产精品亚洲片夜色在线| 揄拍成人国产精品视频| 国产精品99久久久久久www| 久久中文精品| 一本大道久久a久久精品综合| 欧美一区二区三区免费观看| 欧美国产专区| 国产一区二区三区日韩欧美| 亚洲视频免费在线| 欧美激情一区在线| 欧美成人国产| 香蕉免费一区二区三区在线观看 | 欧美99久久|