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的上方。