一直想把引擎的UI部分做强做大可是发现这个难度还是不小
所以只能一步一步蚕食之
一步一步来吧
先说下控件布局管理器吧
布局管理器的目的是按照一定规则排列控件于给定范围内
这是其基本目的
很显然基本的布局管理对象应该包含以下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
流式布局管理的布局策略是从左到右依次设定控件位置如果超出父控件则按照设定的竖直布局换行重新布局(注意它并不改变控件的大小)
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:说实话我觉得写博客是交流思想共同探讨而非其他