随笔 - 505  文章 - 1034  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456


子曾经曰过:编程无他,唯手熟尔!

常用链接

留言簿(94)

随笔分类(649)

随笔档案(505)

相册

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

积分与排名

  • 积分 - 894625
  • 排名 - 14

最新随笔

最新评论

阅读排行榜

评论排行榜

缘起:
接受了一任务:要把设置了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类型。是绝对量。

一般写法:

  1. UDim(float scale, float offset)  

 

可以利用下面的宏单独使用UDim表示绝对量,或者相对量。

  1. #define cegui_reldim(x)     CEGUI::UDim((x),0)  //相对量定义  
  2. #define cegui_absdim(x)     CEGUI::UDim(0,(x)) //绝对量的定义  

 

举个例子:

在sample中的FirstWindow例子中,窗口设置语句:

  1. // Windows are in Relative metrics mode by default.  This means that we can  
  2. // specify sizes and positions without having to know the exact pixel size  
  3. // of the elements in advance.  The relative metrics mode co-ordinates are  
  4. // relative to the parent of the window where the co-ordinates are being set.  
  5. // This means that if 0.5f is specified as the width for a window, that window  
  6. // will be half as its parent window.  
  7. //  
  8. // Here we set the FrameWindow so that it is half the size of the display,  
  9. // and centered within the display.  
  10. wnd->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f)));  
  11. wnd->setSize(UVector2(cegui_reldim(0.5f), cegui_reldim( 0.5f)));  
  12.   
  13. // now we set the maximum and minum sizes for the new window.  These are  
  14. // specified using relative co-ordinates, but the important thing to note  
  15. // is that these settings are aways relative to the display rather than the  
  16. // parent window.  
  17. //  
  18. // here we set a maximum size for the FrameWindow which is equal to the size  
  19. // of the display, and a minimum size of one tenth of the display.  
  20. wnd->setMaxSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));  
  21. 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是最简单的了
  1. 格式为 :{scale, offset}  
  2. 例如  :{1,0}  
父窗口的值乘以“scale”然后加上offset就是最后的结果(单位都是像素)。例如:假如上面的例子是窗口的UnifiedWidth属性值,我们将得到和其父窗口一样宽的窗口。
另一个例子:
{0.5, 25}
这将使得到的窗口宽度为其父窗口的一半加上25像素。
使用单一UDim作为其值的属性有:
    * UnifiedXPosition
* UnifiedYPosition
* UnifiedWidth
* UnifiedHeight 
UVector2
UVector2是用来表示位置和大小的。
  1. 格式为 :{{x-scale, x-offset}, {y-scale, y-offset}}  
  2. 例如  :{{1, 0}, {1, 0}}  
UVector2中包含的两个UDim很像。还是用例子说明吧:假如上面的例子代表窗口的UnifiedSize属性,我们将得到和它的父窗口一样大小的窗口。
  1. {{1,0},{0,100}}  
上例将产生一个和其父窗口一样宽,但是高度固定为100像素的窗口。

使用Uvector2作为其值的属性有:
    * UnifiedPosition
* UnifiedSize
* UnifiedMinSize
* UnifiedMaxSize 
URect
最后的一种是URect。它有点特殊,它定义了左,上,右,下四个坐标,而不是大小或位置。由于参数很多,我将用“ls”代替“left-scale”,用“to”代替“top-offset”等等。
  1. 格式为 :{{ls,lo},{ts,to},{rs,ro},{bs,bo}}  
  2. 例如  :{{0,0},{0,0},{1,0},{1,0}}  
上述代码是DefaultWindow类型窗口的默认矩形。它将覆盖其父窗口的整个区域。只有一个属性使用URect值 ---- UnifiedAreaRect。
我们定义矩形区域而不是其大小的做法是很聪明的。比如:假如我们想使一个窗口覆盖它的父窗口,但要为父窗口的四边分别留出10像素的大小,代码可以这样写:
  1. {{0,10},{0,10},{1,-10},{1,-10}}  
此例可以看出,绝对部分可以取负数。
XML中的应用举例
  1. <property name="UnifiedPosition" value="{{0.1,10},{1.0,-30}}">  
  2. </property>  
X-position:父窗口宽度的10% + 10像素
Y-position:父窗口的高度 - 30像素


  1. <property name="UnifiedSize" value="{{0.6,5},{0.3,20}}">  
  2. </property>  
Width:父窗口宽度的60% + 5像素
Height:父窗口高度的30% + 20像素
  1. <property name="UnifiedXPosition" value="{0.25,-5}">  
  2. </property>  
X-position:父窗口宽度的25% - 5像素

  1. <property name="UnifiedAreaRect" value="{{0.1,0},{0.1,0},{0.9,0},{0.9,0}}">  
  2. </property>  
X-position:父窗口宽度的10%
Y-position:父窗口高度的10%
Width:父窗口宽度的80%
Height:父窗口高度的80%

 

posted on 2009-07-08 00:11 七星重剑 阅读(4880) 评论(1)  编辑 收藏 引用 所属分类: C++ lib -- CEGUI

FeedBack:
# re: CEGUI中的UDim 2009-07-08 09:38 秒大刀
再结合上Alignment,功能超级强大!  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理