一直想把引擎的UI部分做強(qiáng)做大可是發(fā)現(xiàn)這個(gè)難度還是不小
所以只能一步一步蠶食之
一步一步來吧
先說下控件布局管理器吧
布局管理器的目的是按照一定規(guī)則排列控件于給定范圍內(nèi)
這是其基本目的
很顯然基本的布局管理對(duì)象應(yīng)該包含以下2個(gè)基本功能
1.控件的加入和刪除
2.應(yīng)用布局管理器
當(dāng)然也可以有其他附加功能
比如獲取控件個(gè)數(shù)等等
所以我把抽象控件布局對(duì)象設(shè)計(jì)如下:
///////////////////////////////////////////////////////////
/// 定義引擎UI布局管理器
///////////////////////////////////////////////////////////
class GAPI UI_AbstractLayouter : public Object
{
public:
typedef std::list<UI_Widget*> Widgets;
public:
UI_AbstractLayouter();
virtual ~UI_AbstractLayouter();
public:
////////////////////////////////////////////////////////////
/// 布局管理器加載控件
////////////////////////////////////////////////////////////
void AddWidget(UI_Widget* widget);
////////////////////////////////////////////////////////////
/// 布局管理器移除控件
////////////////////////////////////////////////////////////
void RemoveWidget(UI_Widget* widget);
////////////////////////////////////////////////////////////
/// 布局管理器移除所有子控件
////////////////////////////////////////////////////////////
void RemoveAllWidget();
////////////////////////////////////////////////////////////
/// 布局管理器控件排列
////////////////////////////////////////////////////////////
virtual void ApplyLayouter(UI_Widget* parent) = 0;
protected:
Widgets widgets_;
private:
DECLARE_OBJECT(UI_AbstractLayouter)
};
然后就是具體的幾種布局管理器對(duì)象了
下面是我當(dāng)前弄的4種布局管理器了
分別為:
UI_FlowLayouter
流式布局管理的布局策略是從左到右依次設(shè)定控件位置如果超出父控件則按照設(shè)定的豎直布局換行重新布局(注意它并不改變控件的大?。?br>UI_GridLayouter
格子布局管理的策略則是工具設(shè)定布局間隔和子控件,父親控件個(gè)數(shù)重寫設(shè)置所有的子控件大小(這樣所有的子控件大小就一樣了)然后把所有的子控件放置在一個(gè)一個(gè)的格子中
UI_VLayouter
UI_VLayouter和UI_HLayouter則是我從QT中借鑒來的
IU_VLayouter把所有子控件按照從上到下的方式依次布局(不改變子控件大小)(可能會(huì)超出父控件喔)
UI_HLayouter
這個(gè)就不說了
當(dāng)然還可以定制其他布局管理器了
比如UI_DockLayouter
UI_CenterLayouter等等基本原理都是一樣的
做了游戲引擎這么久說實(shí)話
UI真是一個(gè)大塊頭
對(duì)于UI我的設(shè)計(jì)理念就是使用簡(jiǎn)單,功能豐富
題外話1:08年11月的時(shí)候我就想設(shè)計(jì)一套UI庫(kù)
之前認(rèn)為游戲UI是使用windows API話的 呵呵
題外話2:網(wǎng)上關(guān)于使用一些UI庫(kù)的例子很多但是關(guān)于設(shè)計(jì)UI庫(kù)的例子似乎不多
題外話3:說實(shí)話我覺得寫博客是交流思想共同探討而非其他