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

麒麟子

~~

導(dǎo)航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統(tǒng)計(jì)

常用鏈接

留言簿(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是抽象基類,具體的控件類如按鈕,文本標(biāo)簽,都是從它派生而來。HgeGUI屬于整個(gè)GUI系統(tǒng)的manager,它會(huì)保存所有的控件。

關(guān)于hgeGUIObject的8個(gè)成員變量,文檔里已經(jīng)有所描述:

int id; //控件ID

bool bStatic; //是否可以接受鍵盤焦點(diǎn)

bool bVisible; //是否可見

bool bEnabled; //是否有效

hgeRect rect; //控件大小



hgeGUI *gui; //其屬于的 manager ,相當(dāng)于父對象

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

hgeGUIObject *prev;

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

關(guān)于其部分接口的描述:

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

Update: 用于更新其動(dòng)畫

Enter: 控件剛顯示時(shí)的動(dòng)畫

Leave: 控件要消失時(shí)的動(dòng)畫

IsDone: 控件剛顯示和消失時(shí)的狀態(tài)查詢函數(shù)



該類也就是提供了一個(gè)抽象而已,利用C++語言的多態(tài)機(jī)制來方便hgeGUI管理所有的控件。其他具體的控件繼承了hgeGUIObject后,必須實(shí)現(xiàn)構(gòu)造函數(shù)和Render函數(shù)。



關(guān)于hgeGUI:

這個(gè)類應(yīng)該屬于manager。它負(fù)責(zé)管理所有的控件。

其數(shù)據(jù)成員:

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

hgeGUIObject *ctrlLock; //可能是用來保存當(dāng)前被鼠標(biāo)操作的控件

hgeGUIObject *ctrlFocus; //保存焦點(diǎn)控件

hgeGUIObject *ctrlOver; //用來保存鼠標(biāo)指針?biāo)傅目丶?br>


int navmode;

int nEnterLeave;

hgeSprite *sprCursor; //渲染鼠標(biāo)指針用的



float mx,my; //鼠標(biāo)坐標(biāo)

int nWheel; //滾輪偏移量

bool bLPressed, bLLastPressed;//本幀左鍵狀態(tài),上一幀的左鍵狀態(tài)

bool bRPressed, bRLastPressed;

其Update方法會(huì)負(fù)責(zé)控件的進(jìn)入和離開動(dòng)畫,還會(huì)負(fù)責(zé)整體的狀態(tài)設(shè)置---哪些控件擁有焦點(diǎn),哪些控件被鼠標(biāo)正在操作,哪些控件正被鼠標(biāo)指針指著,這些控件它都會(huì)保存起來。(也就是說,我們還是可以通過檢查控件的狀態(tài)來設(shè)置當(dāng)鼠標(biāo)指針在其上時(shí)的新動(dòng)畫。)



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



下面具體看一個(gè)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表示該按鈕的行為是否象一個(gè)RadioButton,bPressed表示當(dāng)前按鈕是否被按下,bOldState表示上一次按鈕狀態(tài),特別用來實(shí)現(xiàn)bTrigger的,sprUp,sprDown分別用來繪制彈起和按下時(shí)的按鈕外觀。這兩個(gè)精靈的創(chuàng)建都是從構(gòu)造函數(shù)的tex上創(chuàng)建而來的,它要求兩個(gè)狀態(tài)必須保存在一幅紋理上,且順序?yàn)閺淖笾劣摇?br>
按鈕的實(shí)現(xiàn)代碼也很簡單:

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;

}

}



聯(lián)系起來,當(dāng)hgeGUI::Update里處理ProcessCtrl時(shí),如果鼠標(biāo)左鍵按下且其指針在按鈕范圍內(nèi),那么就調(diào)用hgeGUIButton::MouseLButton( true ),這個(gè)時(shí)候button的bPressed=true,那么在渲染的時(shí)候,自然就表現(xiàn)出被按下時(shí)的狀態(tài)。

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



雖然HGE引擎的GUI很簡單,但是其擴(kuò)展性很好。因?yàn)閔geGUI::Update基本上派發(fā)了所有控件需要的消息---鍵盤操作,以及鼠標(biāo)操作;而hgeGUIObject基類的很多成員函數(shù)都會(huì)處理這些消息,我們只需要派生hgeGUIObject,然后重載我們需要的消息處理即可。

第二部分:

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

工程結(jié)構(gòu):



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



類結(jié)構(gòu):



整個(gè)系統(tǒng)的工作原理:

用戶繼承抽象基類GUIApp,實(shí)現(xiàn)具體的OnEvent函數(shù),然后該類會(huì)管理所有的GUIAppWindow對象,GUIAppWindow窗口對象會(huì)管理其上的所有子控件。



相應(yīng)地,GUIApp派生類會(huì)直接得到鼠標(biāo)和鍵盤消息,然后派發(fā)給所有窗口對象,然后窗口對象再把消息派發(fā)到具體的控件對象上。



這種Parent-Child關(guān)系大致為:


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



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

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



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



所有控件再創(chuàng)建時(shí),都是以其父窗口為參考坐標(biāo)系的,也就是相對坐標(biāo),但是其實(shí)際保存的坐標(biāo)卻是絕對坐標(biāo)—既相對于整個(gè)屏幕的坐標(biāo)(如果是窗口程序,就相對于整個(gè)窗口)。大致過程為:在GUIAppWindow派生類中創(chuàng)建子控件時(shí),給子控件指定的坐標(biāo)為相對坐標(biāo),然后當(dāng) AddCtrl 時(shí)就會(huì)重新把子控件的坐標(biāo)改變?yōu)榻^對坐標(biāo)。



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



要使用該擴(kuò)展庫,大致步驟為:

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

2. 繼承GUIApp類,在這個(gè)派生類中創(chuàng)建窗口對象,并把窗口對象AddCtrl,在這里可以進(jìn)行其他的初始化工作

3. 在FrameFunc里調(diào)用GUIApp::FrameFunc函數(shù)。



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

posted on 2009-05-18 12:47 麒麟子 閱讀(1510) 評論(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>
            欧美激情一区二区在线| 久久九九有精品国产23| 亚洲激情av在线| 欧美成人资源| 亚洲视频免费看| 亚洲欧美清纯在线制服| 红桃视频国产一区| 欧美激情网站在线观看| 欧美日韩三级在线| 午夜欧美理论片| 久久久久九九九九| 在线亚洲美日韩| 午夜欧美电影在线观看| 亚洲人成在线观看一区二区| 一本色道久久88综合日韩精品| 国产精品尤物| 欧美激情91| 国产精品一二三视频| 欧美大片在线看| 国产精品伦子伦免费视频| 免费视频一区二区三区在线观看| 亚洲人成免费| 国产精品丝袜91| 亚洲高清av在线| 国产午夜精品理论片a级探花 | 在线播放日韩欧美| 亚洲毛片av| 亚洲国产成人在线视频| 亚洲一区免费视频| 亚洲精品欧美在线| 久久精品国产精品| 亚洲神马久久| 欧美本精品男人aⅴ天堂| 久久精品国产综合| 国产精品激情| 亚洲三级影院| 亚洲国产成人高清精品| 欧美一区二区三区免费在线看 | 亚洲一区二区不卡免费| 老司机免费视频久久| 欧美在线黄色| 国产精品九九久久久久久久| 最新成人av网站| 一区在线影院| 欧美亚洲免费电影| 午夜久久一区| 国产精品乱码一区二三区小蝌蚪 | 久久亚洲电影| 国产精品一国产精品k频道56| 最新日韩精品| 亚洲日本乱码在线观看| 麻豆国产精品va在线观看不卡| 欧美在线播放一区| 国产精品一区二区你懂的| 亚洲网在线观看| 亚洲一二三区精品| 国产精品久久久999| 一区二区三区国产精品| 亚洲图中文字幕| 欧美色中文字幕| 99热精品在线观看| 亚洲在线黄色| 国产精品久久久久永久免费观看| 99热在这里有精品免费| 亚洲尤物视频在线| 国产精品日韩欧美大师| 亚洲欧美日韩国产中文在线| 亚洲欧美在线aaa| 国产日韩欧美亚洲| 久久久91精品国产一区二区精品| 久久综合国产精品台湾中文娱乐网 | 亚洲电影下载| 一个色综合av| 欧美色图一区二区三区| 亚洲在线视频观看| 久久在线精品| 亚洲欧洲日本国产| 欧美三级日本三级少妇99| 亚洲一区成人| 久久综合成人精品亚洲另类欧美 | 欧美丝袜一区二区三区| 亚洲欧美国产三级| 久久综合给合久久狠狠色| 欧美国产三区| 一卡二卡3卡四卡高清精品视频 | 亚洲欧洲精品一区二区三区| 欧美久久久久免费| 亚洲免费在线电影| 欧美黄色免费| 亚洲——在线| 在线免费观看成人网| 欧美片网站免费| 午夜精品久久| 亚洲欧洲免费视频| 欧美在线你懂的| 日韩视频在线一区二区三区| 国产精品一区一区| 美女黄毛**国产精品啪啪| 日韩视频免费| 欧美chengren| 亚洲欧美日韩精品一区二区 | 欧美日韩 国产精品| 亚洲欧美国产视频| 亚洲激情一区| 久久久久久久一区二区三区| 一区二区三欧美| 亚洲大胆人体在线| 国产精品亚洲综合天堂夜夜| 欧美成人免费网| 欧美伊久线香蕉线新在线| 亚洲三级视频在线观看| 裸体丰满少妇做受久久99精品| 在线亚洲成人| 亚洲日本aⅴ片在线观看香蕉| 国产精品永久免费观看| 欧美日韩一区二区三区在线看 | 巨乳诱惑日韩免费av| 亚洲尤物在线视频观看| 亚洲激情一区| 欧美国产视频一区二区| 久久亚洲私人国产精品va| 亚洲中无吗在线| 在线亚洲免费| 夜夜嗨一区二区三区| 91久久精品网| 亚洲二区精品| 亚洲高清资源| 在线成人性视频| 一区二区三区亚洲| 国产在线观看精品一区二区三区| 国产农村妇女毛片精品久久麻豆 | 久久九九有精品国产23| 欧美一区二区三区视频免费| 亚洲欧美日韩国产另类专区| 中国av一区| 一区二区三区视频观看| 99xxxx成人网| 中国女人久久久| 亚洲午夜电影在线观看| 亚洲天堂久久| 亚洲视频1区2区| 亚洲欧美日韩精品综合在线观看 | 亚洲精品小视频在线观看| 亚洲国产婷婷| 亚洲精品久久嫩草网站秘色| 亚洲精品国产系列| 亚洲精品欧美一区二区三区| 99精品免费网| 亚洲一区二区三区四区在线观看 | 国内伊人久久久久久网站视频| 久久精品日韩一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 久久免费的精品国产v∧| 久久青草久久| 欧美人与禽猛交乱配视频| 欧美先锋影音| 国产一区日韩一区| 亚洲黄色片网站| 一区二区三区国产在线| 香蕉av福利精品导航| 久久偷看各类wc女厕嘘嘘偷窃| 欧美成人a视频| 亚洲毛片av| 午夜亚洲伦理| 欧美a级一区二区| 国产精品久久久久久影院8一贰佰| 国产九色精品成人porny| 亚洲第一精品在线| 亚洲午夜未删减在线观看| 久久久久久久91| 亚洲人成亚洲人成在线观看| 亚洲欧美不卡| 欧美成在线视频| 国产欧美一区二区精品婷婷| 亚洲国产日韩在线| 午夜视频在线观看一区| 你懂的视频欧美| 亚洲一区二区高清| 免费成人高清在线视频| 国产精品一区二区三区成人| 亚洲激情欧美| 久久九九国产| 一本久道综合久久精品| 久久免费视频网站| 国产精品日日做人人爱| 亚洲精品综合久久中文字幕| 欧美一区网站| 一区二区久久| 欧美国产日韩免费| 狠狠操狠狠色综合网| 亚洲在线中文字幕| 亚洲精品乱码久久久久久久久| 欧美在线一二三四区| 国产精品毛片大码女人| 一本色道88久久加勒比精品| 蜜桃av噜噜一区二区三区| 欧美一级视频精品观看| 欧美日韩在线视频一区二区| 亚洲人成人一区二区在线观看| 久久久人成影片一区二区三区观看|