Ogre 1.7 这个版本比以前有了很多的变化,其中之一就是在Ogre官方不再包含CEGUI的组件,但是尽管没有使用CEGUI,在官方的demo中仍然可以看见有gui的功能,那么Ogre又是怎么实现的呢?
根据官网的说明,新的gui系统使用的是一个叫“tray”的系统,这个系统的主要代码在SdkTray.h这个文件之中。sdktray使用的Ogre overlay来实现gui,并且Ogre 1.7比以前版本似乎也多了一些gui相关的组件,这大概预示,Ogre即将开发自己的gui组件,而cegui也许将被抛弃。
不管未来如何,研究下sdktray还是很有意义的一件事情,使用overlay来实现gui,最大的特点在于可以灵活利用Ogre强大的material系统,实现很多不可思议的效果。比起使用cegui来,减少了学习周期,但是比较遗憾的是,目前Ogre 1.7的sdktray还不能作为一个完整的gui组件,有些功能还很不完善。
现在来研究以下sdktray.h文件的源代码.
一、分析SdkTays.h这个头文件
(1)这个头文件命名空间为:OgreBits
(2)此命名空间下首先定义(包含)了一些枚举TrayLocation(位置)、ButtonState(ButtonState就如同其名字一样,指的是鼠标按下、悬浮以及释放的情况下的gui对应3种状态)
(3)接着定义了一个sdkTrayListener类,它常被用做基类,从接口来看,应该是实现gui对应的功能,包括点击(含有Hit单词的函数)、选择(Select)、移动(Move)等等【本头文件中定义的sdkTrayListener类里面很简单,全是virtual的诸如Hit或Select类的函数,sdkTrayListener是个纯虚类】。
(4)接着定义了一个Widget类(组件类)。
Widget是所有窗口组件的基类。一个Widget包含一个OverlayElement和一个sdktraylistener,分别实现外观和对应的事件响应。这个基类还包括几个static的工具函数。nukeOverlayElement()的作用是删除掉OverlayElement(包括子element),isCursorOver ()用来判断鼠标是否悬浮在gui的上方。需要注意的是这个函数判定包括了边框的判断。并且仅仅实现了矩形的判断,这个大概是因为目前所有的OverlayElment都是矩形的缘故。cursorOffset()获取鼠标离OverlayElement的中心有多少像素远。getCaptionWidth()用来获取一个textAreaO

本文探讨了Ogre 1.7版本中新的GUI系统——SdkTray,该系统基于Overlay实现,不再依赖CEGUI。SdkTray使用了一个名为“tray”的系统,主要代码位于SdkTray.h。作者分析了SdkTray的源代码,包括命名空间、枚举、类定义,尤其是Widget类和它的子类,如Button、TextBox等。虽然SdkTray功能尚不完整,但其灵活性和与Material系统的结合使其具有研究价值。此外,文章还介绍了SdkTrayManager的角色,它是Widget的管理者,负责事件处理和显示层的管理。
最低0.47元/天 解锁文章
5096

被折叠的 条评论
为什么被折叠?



