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

cocos2d-x之CCGUI设计与实现(5)树形控件的实现

2012年04月15日 ⁄ 综合 ⁄ 共 1308字 ⁄ 字号 评论关闭

树形控件是GUI系统中较为复杂的一种控件,用途非常广泛,本篇不对该控件作详细描述,仅针对游戏中应用的树形作一个分析,cocos2d-x本身不对该控件提供任何支持,这里也不可能写一个类似于操作系统层面的复杂控件。

 

控件需求:

(1)支持折叠,点击父节点,子节点可以折叠或展开

(2)支持滑动,树形控件的背景层是一个scroll view,根据树形控件的大小自动调整大小。

当然,基础组件还是本系列的Widget和ScrollView,在写到本篇的时候,Widget和ScrollView相较于最初的雏形,已经更加成熟和稳定,因为大部分控件已经大量用于复杂的游戏系统之中。

 

实现思路:

(1)      数据层和显示层分离,数据层是一个树形的数据结构,这是计算机课程里面的基本结构,这里就不作任何描述了;

(2)      每次添加新的节点,数据层先更新,然后更新显示层,也即数据层是显示层的输入;

(3)      显示层相对麻烦,较为困难的是正确计算节点的位置,本篇重点讨论这个问题。

控件图例:

抽象图如下:

为了更加清晰的计算所有节点的位置,这里定义几个符号,用于后面的描述。

节点i本身的高度为Hi,节点i包括其孩子的总高度为Ai,节点i所在位置(从上往下)定义为Pi ,如上抽象图,从上往下依次为节点1,2,3,4,5,6,那么有:

A的计算比较简单,依次将字节几点的A相加,最后加上自己的高度即可。注意如果节点折叠的话,则有A=H。

 

现在我们根据节点高度H和总高度A来计算其位置P;

我们需要通过一些基本的数据,来推导一个数学式子,使得对于任意的节点,可以轻松的计算其位置。

假定节点1位于位置0,2、3、4、5、6依次往下递增,我们有:

 

OK,注意等式的右边涉及到了基值0、符号H、符号A、符号P,感觉有些乱,然而仔细分析可以发现,对于任意一个节点,如果该节点的前面有兄弟节点,则依赖其兄弟节点即可计算自己的位置,算式为 Pmn = Pm(n-1) + Am(n-1),如果该节点前面是父亲节点,则需要依赖父节点计算位置,算式为Pm1  = Pm   +  Hm,总结如下:

 

注意mn代表的不一定是两个数,也可能是P122321312(其中Pm=12232131,n=2)这样复杂的符号。

        

         有了这几个式子,写代码应该不成问题了,树形控件的位置问题解决以后,其他的都是码砖添瓦的事情,这里就不一一介绍了。

CEGUI里面实现了一个树形控件,然而注释里面明确指出由于设计和实现的质量较差,未能达到其他控件的同一水准,不推荐使用,让人着实蛋疼,不知道是否该参考它的接口与实现。

关于本篇文章,如果有任何疑问,恳请指教。

        

另外说明一下,最近在看高老爷子的《具体数学》,写的非常不错,老爷子写文章用词既严谨又不失诙谐,阅读起来也是一件乐事,作为一名计算机科学专业毕业的学生,也希望自己后面的文章能够做到严谨哈。

        

参考:

CEGUI源代码Tree部分;

 

必须吐槽下:从word到网页,本来就失去了排版的效果,加之于对于有数学公式的文章,只能用图片的方式,就已经够烂的了,更没想到csdn又给图片打了水印,哎,糟糕透顶啊。

抱歉!评论已关闭.