mygui初探(一)基础

mygui初探(一)基础

作者:游蓝海(http://blog.csdn.net/you_lan_hai

        mygui(官网http://mygui.info),是一个开源的游戏ui库,号称高速、易用、灵活,但这是不是真的——谁用谁知道。

1.废话

        每次想写点东西,总是欲言又止。觉得写出来的东西质量可能不高,会误导别人。而且要写的知识都是一两句说不清楚的,担心自己没有那么多的时间来完成。但是知识存在大脑的时间有限,随着时间的流逝,会渐渐淡去。经历了数次的心理斗争,还是决定记下来吧,能记多少就多少,表示我曾经探索过这个领域。夜深人静,动手吧。

2.若干ui库对比

        mygui是一个非重量级的游戏ui库,相比cegui来说他是轻量级的,但是相对于其他一些ui库,比如cocos2d-x、urho3d、bigworld等游戏引擎的ui库来说他是重量级的。我没用过cegui,还不能拿它跟cegui来做比较,以后学习cegui的时候再做比较吧。下面我拿我熟知的这几个ui库做一下比较,说下各自的特点和缺陷。

        cocos2d-x 3.x的ui库,功能还算齐全,支持界面缩放、旋转、相对坐标、ui动画等,算得上一个传统的ui库,开发手游算是凑合。缺点就是,ui编辑器cocostudio不开源,没办法定制ui,而且cocostudio有很多不合理的设计,用起来相当蛋疼,谁用谁骂街。

        urho3d的ui库,让人眼前一亮,采用类似网站开发中的css+div模式,子控件可以按照水平或者垂直模式来连续排版,子控件会根据父控件的尺寸来伸缩自己的尺寸,当然,可以通过指定控件的最小和最大尺寸,保证子控件不会被伸缩的很诡异。它的设计者认为,使用这种模式,可以组合成任意形状的界面,不会也没有必要去拖拽控件,因此它的ui编辑器中,没有拖拽控件的功能。我觉得这是一种强迫症的表现。

        bigworld游戏引擎,是我们项目正在使用的一款游戏引擎,放在这里做比较,纯属我个人对它ui库的吐槽。我觉得它的ui库,就是bigworld程序员拿来做调试写的临时代码。不幸的是有人认为它还不错,于是我们正在使用,幸运的是,给它做ui编辑器人的不是我。

3.mygui库的特点与缺陷        

        个人觉得强大的地方在于皮肤和模板,如果你的项目经常因为ui换皮反复的返工,不妨使用mygui,换皮只需要美术改那么几张图,分分钟就搞定。ui库跟ui编辑器都是开源的,如果你想修改它,以适用于你的项目,这是完全可行的

        但是mygui的缺点也有一大堆:

        * 相对布局功能就像一团浆糊,你要知道,这是一个严重的问题,当游戏窗口尺寸发生变化的时候,你可能会非常的崩溃;

        * 文件系统很差劲,通过增加搜索路径来查找文件,无疑会增加搜索开销,而且这种方式会使你的目录结构看起来很乱,甚至同名文件冲突的可能性也大大提高;

        * 中文字体的支持是硬伤,虽然使用了freetype库,但是它采用了枚举模式,将要用到的字全部列到一张纹理中,可想而知,成千上万的汉字,这得需要一张多大的纹理啊,需要多长的加载时间啊。如果你的字体跟字号又有很多,那么你就等着砸键盘吧;

        * mygui作者是俄国人,给的文档是俄语的,里面大部分代码注释也是俄文,而且网上关于mygui的文档也比较少,这也意味着学习成本比较高;

        * 代码风格不是想象中的那么整齐,跟cegui的整洁度差距真心必较大;

        * 我有移植mygui到手机上,结果他的运行效率并非想象中的那么高。

        说这么多,我只想告诉你,没有一款ui库是绝对好的(至少开源的东西常常是这样的),里面或多或少充斥着若干的陷阱等着你掉进来。mygui并非神一样的ui库,选择需谨慎。

4.mygui中的一些重要概念

        (1)布局(layout)  ui界面的排版信息,存贮为xml文件,后缀名为*.layout,当然其他格式也可以,但是ui编辑器(LayoutEditor)默认只识别*.layout后缀的文件。

        (2)皮肤(skin),描述了如何使用一张图片。一个皮肤可以对应一张图片,也可以是图片中的一个小矩形区域。对于一个纹理区域来说,你可以指定如何使用它,是直接拉伸使用,还是划分成三宫格,还是九宫格,具体怎么划分,皮肤编辑器(SkineEditor)都可以做到。如果是按钮,你还可以指定按钮中的文本出现在那个位置。

        (3)模板(template),本质就是ui布局,描述了一组控件的排版信息。比如窗口界面,窗口上有标题、关闭按钮、背景图,这些是窗口的共有属性,如果能将这些东西组合在一起,构成一个整体,并起一个名字,当需要造窗体的时候,只需指定这个名字,就可以造出标准的窗口了。模板将重复性的东西抽象出来,使得复用更加方便。注意:ui编辑器中的skin选项以及代码中widget的skinChildren,严格来讲,是指这里所说的模板。

        (4)主题(theme),是皮肤和模板的集合。主题只是一个概念,在mygui中并不做任何处理。但是会有一个主题文件存在,其中引用了若干个皮肤和模板文件,加载主题文件的时候,其中的皮肤文件和模板文件会被加载到内存中。

        (5)层(layer),即层级。ui会有很多层级,比如背景图始终的界面最底端,tips、menu总是在最上端,鼠标在最顶端。需要特别注意的是,有两种类型的层:覆盖层(OverlappedLayer)和共享层(SharedLayer)。在覆盖层中,界面可以相互覆盖;但是在共享层中,界面的遮挡关系完全是混乱的,这是为了提高渲染效率,将文字、图片放到了不同的渲染队列中。另外,在一个界面(Widget)内,子控件都是共享层模式,他们的遮挡关系是混乱的,如果你试图给某界面增加一个子界面,你将得不到准确的层级顺序。

5.后话

        作为一个屌丝程序员,干不了别的工作,就好好为程序而生吧。写代码,读代码,写总结,慢慢成长。标题之所以有“初探”和“(一)”,是因为我想继续写二、三、四,深入、源码剖析等,但愿我有时间继续下去。




转载于:https://www.cnblogs.com/ygxsk/p/7693991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值