缘起:
接受了一任务:要把设置了ClickStep的CEGUISlider的行为改成像wow里一样,一次拖动一个step(当鼠标超过一半step的时候,Thumb跳到下一个节点)。
这个要改CEGUIThumb的onMouseMove。这次好好理解了下UDim,之前一直不肯花时间理解这个,这次不得不花精力了,懒是人的天性!理解了UDim这个问题就很简单了!
http://blog.csdn.net/dizuo/archive/2009/03/21/4010718.aspx
CEGUI中的UDim
今天看了CEGUI中最新增加的The Unified Co-ordinate System。觉得很有创意啊。真佩服设计者。
一直以来窗口坐标系中坐标转换就令人头晕,相对坐标系,绝对坐标系。
1,相对坐标系,主要是当窗口size改变以后,object在窗口的相对位置不变,因此必须使用比例系数来设定。
例如opengl中的reshape函数中glPerspective中aspect量的设置,为了窗口变化时候,视口不变,aspect = w/h。而不是使用绝对的数字,0.5,或其他。
2,绝对坐标系,就是窗口坐标系(一般是X轴向右为正,Y向下为正,原点左上角)中的坐标,窗口变化后,坐标不变。
然而CEGUI中的UDim设计正是结合了相对量和绝对量,UDim成员:
scale:相对于父窗口的缩放参数,介于0到1之间。是相对量
offset是偏移量,以像素为单位,有正负之分。源文件定义为float类型。是绝对量。
一般写法:
- UDim(float scale, float offset)
可以利用下面的宏单独使用UDim表示绝对量,或者相对量。
- #define cegui_reldim(x) CEGUI::UDim((x),0) //相对量定义
- #define cegui_absdim(x) CEGUI::UDim(0,(x)) //绝对量的定义
举个例子:
在sample中的FirstWindow例子中,窗口设置语句:
-
-
-
-
-
-
-
-
-
- wnd->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f)));
- wnd->setSize(UVector2(cegui_reldim(0.5f), cegui_reldim( 0.5f)));
-
-
-
-
-
-
-
-
- wnd->setMaxSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));
- wnd->setMinSize(UVector2(cegui_reldim(0.1f), cegui_reldim( 0.1f)));
四个语句使用了相对量cegui_reldim设置了窗口的属性,w,h为父窗口尺寸
位置:(w/4, h/4)
尺寸:width = w/2 height = h/2
最大尺寸:w_max = w,h_max = h
最小尺寸:w_min = w/10, h_min = h/10
而运行效果正是预期。
UDim既然是一维的,可以表示width,height,xposition,yposition等。
CEGUI主要是做GUI的,所以统一坐标系下只给出了一维的UDim,二维的UVector,以及平面中的URect定义。理解了一维的东西,二维UVector,URect就很好理解了。
http://blog.csdn.net/bluekane/archive/2009/01/09/3738482.aspx
cegui 6
cegui 6统一度量系统使用指南
注意:此教程仅适用于CEGUI >= 0.4.0
统一度量系统使得我们可以用相对部分和绝对部分共同来表示一个坐标或大小。这给窗口布局带来了极大的方便。比如:你可以用相对尺寸来表示高度,使用绝对大小表示宽度,或者混合使用。
统一度量系统共有三种形式
* UDim : 简单的一维
* UVector2 : 由两个UDim组成的二维向量
* URect : 用四个UDim表示一个矩形,依次为:左,上,右,下
UDim
UDim是最简单的了
- 格式为 :{scale, offset}
- 例如 :{1,0}
父窗口的值乘以“scale”然后加上offset就是最后的结果(单位都是像素)。例如:假如上面的例子是窗口的UnifiedWidth属性值,我们将得到和其父窗口一样宽的窗口。
另一个例子:
{0.5, 25}
这将使得到的窗口宽度为其父窗口的一半加上25像素。
使用单一UDim作为其值的属性有:
* UnifiedXPosition
* UnifiedYPosition
* UnifiedWidth
* UnifiedHeight
UVector2
UVector2是用来表示位置和大小的。
- 格式为 :{{x-scale, x-offset}, {y-scale, y-offset}}
- 例如 :{{1, 0}, {1, 0}}
UVector2中包含的两个UDim很像。还是用例子说明吧:假如上面的例子代表窗口的UnifiedSize属性,我们将得到和它的父窗口一样大小的窗口。
上例将产生一个和其父窗口一样宽,但是高度固定为100像素的窗口。
使用Uvector2作为其值的属性有:
* UnifiedPosition
* UnifiedSize
* UnifiedMinSize
* UnifiedMaxSize
URect
最后的一种是URect。它有点特殊,它定义了左,上,右,下四个坐标,而不是大小或位置。由于参数很多,我将用“ls”代替“left-scale”,用“to”代替“top-offset”等等。
- 格式为 :{{ls,lo},{ts,to},{rs,ro},{bs,bo}}
- 例如 :{{0,0},{0,0},{1,0},{1,0}}
上述代码是DefaultWindow类型窗口的默认矩形。它将覆盖其父窗口的整个区域。只有一个属性使用URect值 ---- UnifiedAreaRect。
我们定义矩形区域而不是其大小的做法是很聪明的。比如:假如我们想使一个窗口覆盖它的父窗口,但要为父窗口的四边分别留出10像素的大小,代码可以这样写:
- {{0,10},{0,10},{1,-10},{1,-10}}
此例可以看出,绝对部分可以取负数。
XML中的应用举例
- <property name="UnifiedPosition" value="{{0.1,10},{1.0,-30}}">
- </property>
X-position:父窗口宽度的10% + 10像素
Y-position:父窗口的高度 - 30像素
- <property name="UnifiedSize" value="{{0.6,5},{0.3,20}}">
- </property>
Width:父窗口宽度的60% + 5像素
Height:父窗口高度的30% + 20像素
- <property name="UnifiedXPosition" value="{0.25,-5}">
- </property>
X-position:父窗口宽度的25% - 5像素
- <property name="UnifiedAreaRect" value="{{0.1,0},{0.1,0},{0.9,0},{0.9,0}}">
- </property>
X-position:父窗口宽度的10%
Y-position:父窗口高度的10%
Width:父窗口宽度的80%
Height:父窗口高度的80%
posted on 2009-07-08 00:11
七星重剑 阅读(4899)
评论(1) 编辑 收藏 引用 所属分类:
C++ lib -- CEGUI