CEGUI学习心得汇总

大学时就用过CEGUI,但是基本上就是用,没有其他任何思考。现在做的东西多了,思考也多了。同事推荐看一本国人写的《CEGUI深入解析》,一开始看了一些,但没看进去,做了项目一个多月,有些实际的问题,再去看就有收获了。此文章就收集一些使用CEGUI的心得,以便回顾或者帮助他人。更多系统权威资料还请见CEGUI官网

  1. Subscriber类对象之间不能直接赋值

    我们有的时候想保存一些Subsriber类对象,以供程序运行过程中调用设置回调函数。但需要注意的是,SubScriber类中使用了new操作符,并且没有合理的赋值操作符,所以不要轻易将一个Subscriber类对象复制给另外一个Subscriber类对象。除非你知道这个问题的存在,并且避免Subsriber类内new出来的对象被多次delete,那么你可以让Subsriber对象之间赋值。

  2. 子窗口可以显示在父窗口之外

    有时需要一些特殊的效果,如标签页在窗口外侧,那么我们就需要子窗口显示在父窗口可视范围之外。这个实现起来很简单,直接使用setClippedByParent( false )即可。

  3. 子窗口的位置之谜

    对于LookNFeel里面的一个控件内添加子控件,我一直都很迷惑,子控件的位置到底是怎么算的?看下面的例子:
    <Child type="TaharezLook/Titlebar" nameSuffix="__auto_titlebar__">
            <Area>
                <Dim type="LeftEdge" ><AbsoluteDim value="10" /></Dim>
                <Dim type="TopEdge" ><AbsoluteDim value="10" /></Dim>
                <Dim type="Width" ><UnifiedDim scale="1" type="Width" /></Dim>
                <Dim type="Height" ><UnifiedDim scale="1" type="Height" /></Dim>
            </Area>
            <Property name="AlwaysOnTop" value="False" />
    </Child>

    假如父窗口是一个FrameWindow,那么这个子窗口的位置和大小到底是多少呢?当然你跑一下程序就知道了,但是为什么是这样呢?首先还是说一下正确结论:
    1. 子窗口的位置是以父窗口的InnerRect左上角为原点的。
    2. 子窗口的大小是根据子窗口的NonClient属性来做不同判断的。NonClient表明这个窗口是否属于客户区(客户区即InnerRect),true表示不属于(因为属性名是NonClient)。false表明属于客户区。此属性默认值为false。即一般子窗口不指定该属性,在其位父窗口客户区的。

      判断规则:如果子窗口NonClient是true,那么CEGUI会根据父窗口的OuterRect(整个窗口大小)来计算,如果NonClient是false,那么CEGUI会查看父窗口是否有InnerRect如果有根据InnerRect算,如果没有只能根据OuterRect算。InnerRect的获取又会牵扯到是否窗口有RenderingWindow(渲染窗口),如果有根据渲染窗口的函数来判断。没有渲染窗口则还是使用OuterRect。

    具体代码可以查阅一下CEGUI::Window::setArea,里面计算baseSize的时候可以看出到底是根据谁来计算比例分量的。

    //----------------------------------------------------------------------------//
    void Window::setArea(const UVector2& pos, const UVector2& size)
    {
        // Limit the value we set to something that's within the constraints
        // specified via the min and max size settings.
    
        // get size of 'base' - i.e. the size of the parent region.
        const Size base_sz((d_parent && !d_nonClientContent) ?
                                d_parent->getUnclippedInnerRect().getSize() :
                                getParentPixelSize());
    
        UVector2 newsz(size);
        constrainUVector2ToMinSize(base_sz, newsz);
        constrainUVector2ToMaxSize(base_sz, newsz);
    
        setArea_impl(pos, newsz);
    }
    

    窗口位置目前是听同事说的根据窗口的InnerRect(窗口其实都会有InnerRect,主要是看是否和OuterRect一样),像FrameWindow这样的就会有一个和OuterRect不一样的InnerRect。以后我会求证的!



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CEGUI(Crazy Eddie’s GUI http://www.cegui.org.uk)是一个自由免费的GUI库,基于LGPL协议,使用C++实现,完全面向对象设计。CEGUI开发者的目的是希望能够让游戏开发人员从繁琐的GUI实现细节中抽身出来,以便有更多的开发时间可以放在游戏性上。 CEGUI的渲染需要3D图形API的支持,如OpenGL或Direct3D。另外,使用更高级的图形库也是可以的,比如OGRE、Irrlicht和RenderWare等,关键需求可以简化为二点: 纹理(Texture)的支持直接写屏(RHW的顶点格式、正交投影、或者使用shader实现) 本书截止日时,CEGUI的最新版本是0.6.0(本书的讨论也是基于此版本),本书光盘提供了SDK和全部源码的下载。 除此之外,CEGUI还同步提供了官方界面编辑器LayoutEditor和ImageSet编辑器,以方便UI和图像集的制作。作为界面编辑器,它需要系统级界面以提供编辑器操作,0.3.0版是基于MFC实现的;而在0.4.0版本以后,改为基于wxWidgets(跨平台的本地UI框架,这里的UI指Window操作系统底层,如:Windows、Unix和Mac,详见http://www.wxwidgets.org)实现。 目前将CEGUI作为游戏界面库开发的游戏已经有好多种,国内的天龙八部,巨人等游戏就是很好的例子。 CEGUI的功能是非常强大的,而且使用也非常的灵活,可以和脚本配合。可以通过配置文件自定义窗口外观。通过布局文件实现窗口布局等等特性,使得游戏的界面开发更加方便。
CEGUI的详细笔记和文档,学习游戏编程的朋友一定要看看 第1章 CEGUI的简介 - 5 - 1.1CEGUI历史和本书使用的版本 - 5 - 1.2 CEGUI的编译和例子介绍 - 5 - 1.2.1CEGUI源代码的简介 - 5 - 1.2.2CEGUI源代码编译 - 7 - 1.3 CEGUI官方编辑器的介绍 - 10 - 1.3.1 CEGUI布局编辑器 - 10 - 1.3.2 图像集编辑器 - 12 - 1.4 CEGUI总体架构 - 13 - 第2章 CEGUI事件系统和属性系统 - 15 - 2.1 CEGUI的事件系统 - 16 - 2.2 CEGUI的属性系统 - 29 - 2.3 属性事件与布局文件 - 32 - 第3章 CEGUI基类的实现 - 39 - 3.1 窗口设计原理 - 39 - 3.2 Window类 - 40 - 3.2.1 Window类的继承关系以及与其相关的函数。 - 40 - 3.2.2 窗口的组织结构 - 41 - 3.2.3 窗口位置和大小 - 45 - 3.2.4窗口渲染 - 51 - 3.2.5 事件响应与处理 - 59 - 3.2.6 窗口状态 - 60 - 3.2.7 窗口与输入系统 - 61 - 3.2.8 窗口的其他功能 - 63 - 3.3 窗口类厂和类厂管理 - 64 - 3.3.1 窗口的类厂和类厂管理 - 64 - 3.3.2 渲染窗口的类厂和类厂管理 - 72 - 3.4 窗口管理系统 - 76 - 第4章 CEGUI核心控制体系 - 80 - 4.1 系统控制 - 80 - 4.1.1 系统变量 - 80 - 4.1.2 初始化和退出流程 - 82 - 4.1.3 输入系统的事件派遣流程 - 87 - 4.2 资源管理 - 96 - 4.2.1资源管理模式 - 96 - 4.2.2 图像集 - 102 - 4.3 系统接口 - 106 - 4.3.1 脚本接口 - 107 - 4.3.2 XML相关接口 - 107 - 4.3.3 图像解码接口 - 108 - 4.3.4 资源提供接口 - 109 - 4.4渲染机制 - 109 - 第5章 CEGUI应用程序框架 - 118 - 5.1 OpenGL程序框架 - 118 - 5.1.1 WIN32应用程序框架 - 118 - 5.1.2 OpenGL应用程序框架 - 122 - 5.1.3 CEGUI应用程序框架 - 124 - 5.2 CEGUI例子程序 - 125 - 5.2.1 加载资源和创建窗口 - 126 - 5.2.2 窗口的逻辑处理 - 127 - 第6章 外观系统 - 131 - .........

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值