一直想把引擎的UI部分做強做大可是發(fā)現這個難度還是不小
所以只能一步一步蠶食之
一步一步來吧
先說下控件布局管理器吧
布局管理器的目的是按照一定規(guī)則排列控件于給定范圍內
這是其基本目的
很顯然基本的布局管理對象應該包含以下2個基本功能
1.控件的加入和刪除
2.應用布局管理器
當然也可以有其他附加功能
比如獲取控件個數等等
所以我把抽象控件布局對象設計如下:
///////////////////////////////////////////////////////////
/// 定義引擎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)
};
然后就是具體的幾種布局管理器對象了
下面是我當前弄的4種布局管理器了
分別為:
UI_FlowLayouter
流式布局管理的布局策略是從左到右依次設定控件位置如果超出父控件則按照設定的豎直布局換行重新布局(注意它并不改變控件的大?。?br>UI_GridLayouter
格子布局管理的策略則是工具設定布局間隔和子控件,父親控件個數重寫設置所有的子控件大小(這樣所有的子控件大小就一樣了)然后把所有的子控件放置在一個一個的格子中
UI_VLayouter
UI_VLayouter和UI_HLayouter則是我從QT中借鑒來的
IU_VLayouter把所有子控件按照從上到下的方式依次布局(不改變子控件大小)(可能會超出父控件喔)
UI_HLayouter
這個就不說了
當然還可以定制其他布局管理器了
比如UI_DockLayouter
UI_CenterLayouter等等基本原理都是一樣的
做了游戲引擎這么久說實話
UI真是一個大塊頭
對于UI我的設計理念就是使用簡單,功能豐富
題外話1:08年11月的時候我就想設計一套UI庫
之前認為游戲UI是使用windows API話的 呵呵
題外話2:網上關于使用一些UI庫的例子很多但是關于設計UI庫的例子似乎不多
題外話3:說實話我覺得寫博客是交流思想共同探討而非其他