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

            飯中淹的避難所~~~~~

            偶爾來避難的地方~

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks

            在過去的8年里,我經過數次失敗的GUI系統設計經歷,最終找到了一種算是可以的方案。這個方案使用一種類似MVC的架構。主要有以下幾個大的部分:

            【sprite系統】

            sprite是一個從古老的游戲中一直演化過來的概念,而在這里,它代表了屏幕上的一個次元(層)中所有可見元素。

            它描述了一個屏幕上的矩形,以及和其他矩形的關系。

            它具有自己的更新和繪制方法。

            它具有自己的各種特性,比如可拖動,比如事件冒泡。

            同時,它還有一個稱為控制器的東西,這個東西會在創建或者attach的時候對sprite進行修改或者初始化。會處理sprite的輸入事件,并可以接管sprite的繪圖處理。

            【UI元素】

            UI元素是sprite的控制器接口的實現。并且會在初始化時去創建sprite,以達到顯示的目的。

            一個UI元素就代表一個UI控件,比如一個編輯框,或者是一個combobox。

            每個UI元素上都有數個事件的插槽,應用程序可以通過向這些插槽插入事件處理來關注UI元素。

            【UI腳本】

            UI元素的插槽不僅可以插入一個事件處理,還可以插入一個UI腳本的方法索引。

            而腳本系統和腳本方法索引,都是接口和無特定指向意義的數值類型,方便腳本擴展。

            【引擎接口】

            因為UI系統中會用到繪圖,貼圖,聲音,為了通用性,這些都被抽象為接口,以便于不同引擎的支持。

            但是這個里面有一點非常重要,就是一定不要依賴于某個特定引擎或者平臺的特性進行接口設計,那會讓你束手束腳。

            【資源管理】

            因為UI系統中會涉及到比較多資源,所以,所有資源都被統一管理起來。通過字符串來進行資源索引。返回的是資源的接口指針。

            在資源管理內部,對每種資源都有一個緩沖池。當然只做按名字緩沖,畢竟比較深層次的資源緩沖還要依賴引擎接口來完成。

            資源里主要有以下幾種:圖像(貼圖組合動畫),貼圖,聲音,字體。

            【文字繪制】

            文字繪制,由字體資源和繪圖引擎接口共同來完成。


            字體資源里有個中間件,用來管理字體的緩存,目前是采用256級灰度點陣來存儲,在各種繪圖引擎和平臺中都可以方便的轉化為屏幕圖元,并且還有灰度來保障邊緣混淆的正確顯示。

            【關于繪圖系統】

            繪圖系統中,GUI的需求主要是 貼圖, 繪制簡單的矩形邊框矩形填充, 繪制線條, 裁剪。

            GDI繪圖,一開始就被放棄了,因為它的整個系統的繪圖特性過多,會導致關注點的分散。為了替代GDI繪圖,我實現了一套內存位圖的繪圖庫。不過最終這個庫還是會把結果丟到GDI的HDC上,只是中間過程里,都是在內存中進行圖像的各種混合。

            DX和OGL,因為這兩個都可以支持貼圖,所以實現UI系統需要的接口完全沒有問題。在實際GUI的編碼和測試中,我使用HGE這個DX的封裝接口來間接實現了UI系統所需的繪圖接口。


            【數據源】

            UI系統里,每個UI元素都是從數據源中進行讀取并創建的。

            數據源是一個純虛接口的形式,在實際編碼和測試中,我使用的是XML作為數據源。

            XML既有良好的可讀性,又易于程序處理。非常適合在這里作為數據源。

            【UI編輯器】

            相應的,生成數據源的部分,就是靠UI編輯器。

            UI編輯器本身也是通過UI系統實現的。

            UI編輯器主要包括幾個部分:布局編輯器、貼圖撿取、屬性編輯。其中布局編輯器這里,每個控件的繪制仍舊調用的是它自身的繪圖方法,不過為了防止觸發控件本身的事件,我用一個控件編輯容器樹,代替了原來的控件元素樹,樹結構還是使用原有的結構,控件被作為空間編輯容器的子元素。


            【歷史】

            2002年 第一版UI系統   繪圖使用DIRECTDRAW,采用UI元素和UI視覺元素統一的方法,采用一棵樹進行繪制和UI自身的管理。沒有數據源,沒有編輯器,沒有腳本系統,完全試驗品。失敗原因:UI元素的設計問題,以及架構不完善。

            2005年 第二版UI系統 繪圖采用D3D,采用UI元素和UI視覺元素統一的方法,采用一棵樹進行繪制和管理。無數據源,無編輯器,無腳本系統,有事件處理插槽,在客戶端進行了小規模的使用。

            2008年 第三版UI系統 繪圖采用抽象接口,有GDI(內存位圖)和D3D實現。采用UI元素和UI視覺元素統一的方法,一棵樹繪制和管理。有數據源,無編輯器,無腳本系統,僅在開發和測試環境內進行了使用。失敗原因:糾結在UI元素布局的管理上,后發現是UI元素的設計有問題。

            2009年 第四版UI系統 繪圖采用抽象接口,有GDI(內存位圖)和D3D(HGE),采用UI元素和UI視覺元素統一方法,一棵樹繪制和管理,有數據源,有編輯器。失敗原因:UI元素和視覺元素統一的方法,給UI元素的管理和UI元素的邏輯實現帶來很大限制。

            2011年 第五版UI系統 繪圖采用抽象接口,有GDI(內存位圖)和D3D(HGE),采用UI元素和UI視覺元素分開的方法,分為一顆邏輯樹,一顆視覺樹。數據源仍舊用XML,用第四版的編輯器實現方式。
            posted on 2011-04-30 14:04 飯中淹 閱讀(2520) 評論(2)  編輯 收藏 引用 所屬分類: 游戲客戶端

            評論

            # re: 【游戲GUI】 2011-05-03 16:19 戰魂小筑
            UI編輯器本身也是通過UI系統實現的
            這點嚴重同意,哈哈, 能把自己的編輯器做出來的UI已經很強大了,MyGUI就是這樣的.

            我以前寫過的UI(http://www.shnenglu.com/sunicdavy/archive/2009/07/24/91059.html) 的邏輯部分學魔獸全腳本, 雖然套用了自己寫的lua調試器,但是越寫到后面越累. 因此還是C++為主,腳本為輔的組合比較好  回復  更多評論
              

            # re: 【游戲GUI】 2011-05-17 15:12 simfe
            也不發張效果圖來看看  回復  更多評論
              

            综合久久精品色| 亚洲∧v久久久无码精品| 久久久久久久综合日本亚洲| 久久国产高潮流白浆免费观看| 久久久精品免费国产四虎| 中文精品久久久久国产网址| 久久www免费人成看国产片| 伊人久久成人成综合网222| 国产精品一区二区久久不卡| 一级女性全黄久久生活片免费 | 久久91精品综合国产首页| 思思久久99热只有频精品66| 久久99精品久久久久久久不卡| 国产成人综合久久精品尤物| 亚洲精品乱码久久久久久久久久久久| 99久久精品国产一区二区| 一本久久知道综合久久| 久久精品18| 99久久综合狠狠综合久久止| 久久精品国产99久久久古代| 91精品日韩人妻无码久久不卡| 亚洲AV无码久久精品成人| 久久久久国产视频电影| 91精品国产91久久久久久青草| 午夜不卡久久精品无码免费| 伊人久久大香线蕉无码麻豆| 久久福利片| 久久WWW免费人成—看片| 色综合久久最新中文字幕| 91精品国产高清久久久久久io| 久久久亚洲AV波多野结衣| 人妻中文久久久久| 久久精品无码一区二区三区免费| 狠狠色丁香婷婷久久综合不卡| av无码久久久久久不卡网站 | 国产精品久久久久久福利69堂| 久久精品人妻中文系列| 久久久黄色大片| 久久人人爽人人爽人人片av麻烦| 久久久久亚洲av毛片大| 久久久受www免费人成|