现在的位置: 首页 > 综合 > 正文

OEGUI0.2版本放出 支持SDKTray已经实现的所有GUI组件

2013年01月08日 ⁄ 综合 ⁄ 共 3142字 ⁄ 字号 评论关闭

一 介绍

    OEGUI是一个完全基于Ogre1.7的GUI组件.这个组件在Ogre的OverlayElement的基础上,添加了功能,实现了一个轻量级的GUI解决方案.

     下载地址:http://download.csdn.net/source/2297691

二 特性

    1 支持使用Ogre::Overlay脚本创建GUI

    2 各个组件的外观以及功能均可以运行时任意变换.比如,你可以让一个button随时成为一个Scroll(虽然大多数情况下不会这么做.)

    3 学习简单 使用方便 上手容易 这是一个轻量级的解决方案

三 0.2版本的更新

    1 更正了一些0.1已知的BUG(Ps:由于时间有限,目前只在Pixel坐标模式下测试过)

    2 WidgetOverlayElement 有关改变外观的功能,被独立出来成为一个单独的SkinAction功能类

    3 强化了ColourTextAreaOverlayElement的功能.现在支持设置参数,以字符为单位,把文本放在屏幕上不同的任意位置.

    4 Action获得了重大更新.现在一个Action分为MouseAction KeyAction和FrameAction3个子类,每个具体的派生类则实现特定的GUI功能.这些具体的Action如下:

     MouseAction:Skin Drag HScroll VScroll PopUp Progress Rect RectWithoutBorder Round Ellispce

     KeyAction:Input

     这些类具体的介绍请看第五条.

四 OverlayElement扩展介绍

     WidgetOverlayElement:所有GUI组件的基类.这个类保存不同的材质参数,从而实现不同状态下外观的变化.除此之外,还添加有基本的响应动作接口.一个Widget可以随意挂接任意个数的Action类,以便实现不同的行为.一般来说 Widget的各个参数都可以通过脚本来设置,在程序中用到的API接口主要是一些查找Action的辅助函数.应该说这些辅助函数都是一些"偷懒"的函数,因为System提供了一个根据名字来实现全局查找的功能.但对于那些由脚本创建的Widget,由于Ogre独特的脚本命名机制,你可能不希望花费心思去研究这个Widget的名字应该是什么.

     根据Ogre脚本命名机制,子Widget的组件为父组件的名字加脚本中的名字.因此使用后缀匹配进行查找是可以简化工作的.查找到第一个名字的末尾为"suffix"的组件,并且是对应的type的时候,函数返回.这个函数只返回符合条件的第一个结果,所以如果希望查找的结果和自己的预期不出偏差的话,写自己的脚本的时候,应该注意所有的Widget名字的末尾都不应该相同,也不应该有包含的情况发生.

     OverlayElement* findChildElementBySuffix(const String &suffix,const String &type);

     OverlayElement* findRelativeElementBySuffix(const String &suffix,const String &type);
     Action* findChildActionByTypeName(const String &type);
     Action* findRelativeActionByTypeName(const String &type);

     这4个接口findChild版本在自己的子组件中查找,这个查找包括"child的child".而Relative版本功能更为强大,所谓Relative指的是所有与这个Widget有父子关系的组件,包括"间接"的属于那种"远房表亲"的关系.另外,这几个接口都不查找自身所属的Action.

    

     ColourTextAreaOverlayElement支持显示区域的设定.可以指定一个区域,让文本在这个区域中自动排列,多余的文本则会自动被裁剪.另外,这个函数还有一个接口,支持人为设定每个字符的具体位置.你设置可以把第一个字符放在左边,第2个字符放在右边,第3个字符放在中间.

五 Action扩展介绍

     Action应该是OEGUI最重要的模块.这些Action的扩展使得WidgetOverlayElement具备了响应时间的功能

     SkinAction:这个类的功能实现了Widget外观随鼠标位置和动作的变化而变化的功能.这个功能在0.1版本中写进了WidgetOverlayElement类.现在把这个功能独立了出来,以便支持不同的改变皮肤策略.但是,一个Widget构造的时候,会默认添加这个Action,所以大多数时候不用把这个写入脚本.

     RectAction,RectWithoutBorder,Round,Ellispse 这个4个Action 实现了让一个Widget如何判断响应鼠标事件的策略.使用Rect,当鼠标位于这个Widget的矩形区域内的时候,则响应鼠标点击 移动等事件.Round则是为一个最大的内切圆,Ellispse设定检测区域为一个内切的椭圆.

     Drag 这个Action实现了自由拖动的效果.这个类有一个接口,可以设定,移动的时候是否和父组件一起移动.默认设置为true.另外,这个类还可以设置参数,指定拖动的响应区域.默认区域为整个Widget.

     HScroll VScroll 横向和竖向的滚动条.这2个类从ScrollAction虚类派生,通过不同的策略实现不同的拖动效果.事实上如果愿意,可以写一个在特定曲线上拉动的滚动条.

     PopUp 实现了弹出菜单的效果.本质上,当一个PopUp的Widget被点击的时候,一些副本将被拷贝.但是,不管使用是原型还是拷贝的指针来获得数据,都可以获得相同的结果.

     Progress 进度条,根据设定的数据改变自己的长度.这个ProgressAction是自适应的,会自动根据父组件的宽度和高度自动改变大小.

     Input 实现文本的输入效果,支持中文输入.需要说明一点的是,由于Ogre本身的类继承关系,一个TextArea不是一个Container,所以一个ColourTextArea没有响应事件的功能.但是,在脚本中仍然需要在ColourTextArea的区域中添加Action属性,这样才能让一个Action和一个ColourTextArea相联系起来(程序中使用API也是可以的,但是为什么不放在脚本做这个事情呢?).而这个Action本身,则会添加入这个ColourTextArea的父Widget的Action列表中去.

     最后提一下FrameAction.这个FrameAction实现了Ogre的帧循环接口.所以假如有什么希望系统能自动更新的,这个正是所希望的.在代码包附带的Demo中,实现了一个Debug的FrameAction.这个Action把一个竖向的滚动条和一个进度条相联系起来,并且动态更新一个ColourTextArea的caption,显示目前的"进度".

六 demo 截图

     我承认这个看上去不是那么激动人心,但是假如理解了Widget-Action架构,你会为你所拥有强大的可控自由度而疯狂.

     这个截图中间的那个长条是一个VScroll,竖向的滚动条,在这个下拉条上面,有一个进度条和一个ColourTextArea,程序使用了一个Debug的Action,把这个3个组件相联系起来,实现了联动更新的效果.

 

抱歉!评论已关闭.