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

基于OgreBites::Widget 实现自己的GUI系统(2)

2013年11月03日 ⁄ 综合 ⁄ 共 1352字 ⁄ 字号 评论关闭

今天写了自己的OEGUISystem类

这个类功能主要如下:

1 管理鼠标.鼠标的外观显示使用了一个OECursor类来管理.如果不关心自己创建鼠标的外观,OEGUISystem默认实现ogre sample中的那个鼠标外观.

 

2 管理事件.OEGUI事件的触发和CEGUI类似,调用::OEGUISystem::getSingleton().inject***().函数返回true 表示 鼠标位置正处于某个Widget上方.不管这个widget响不响应对应的事件,OEGUI认为只要鼠标在某个Widget上方,则 这个Widget获得焦点,并且不在对后继的Widget进行窗口的事件注入.

 

3 管理焦点.对失去焦点的widget,将调用_focusLost().

 

4 窗口和Widget管理.OEGUI并没有实现create方法,而是实现了一个registerWindow()方法,这个方法在窗口的构造函数中调用,把自己注册到System中来,只有注册了的窗口才能实现事件的注入.OEGUI对注册了的窗口按照zorder进行排序,当zorder在上的窗口获得事件处理后,将不在对后继的窗口注入事件.

 

5 动态外观管理.widget的外观由2部分组成.一个是默认外观,这个外观的设置在overlay脚本中设置.另一个外观是运行中对不同状态响应的外观.这部分外观widget中源代码写死了,为了实现动态外观的管理,把动态外观的材质名称独立出来作为OEGUISystem的一个参数,各个widget初始化时从OEGUISystem中获得这部分参数,从而实现动态外观的管理.需要注意的是每个widget仍然保留了这个参数的一个副本,这样可以实现相同类型Widget的不同实例拥有不同的外观.从目前几个widget实现来看,只有少数几个Widget才受影响.如果需要改变基础显示,应该在脚本中改变材质.

 

6 键盘输入管理.这部分是sdktray的空白.目前基础功能已经实现了.我的键盘管理没有放到OEWindows,而是统一在OEGUISystem中实现.system中保留一个获得键盘焦点的Widget指针,当有键盘输入的时候,调用键盘焦点的回调函数.我对键盘焦点获得的判定是根据鼠标.当鼠标在某个Widget上面点击的时候,则这个Widget同时获得键盘焦点.在这个基础上,我实现了一个EditBox,实现键盘输入.EditBox使用一个函数来过滤不必要的文字输出.比方说F1 Shift等按键不属于"正常"文字的按键都被过滤掉了.不过如果重写这个函数的话,也可以实现诸如按下A输出B之类的效果.  这些有关文字的操作主要使用的Ogre::DisplayString 这个类的接口.EditBox基本功能已经实现,但是还不是很完善,一个是一般游戏中的聊天框字体都是从下开始显示的,这个Box是从上显示的,需要获得更改,其次也还没有实现光标的跟随.这些明天来实现.其次,对没有获得键盘焦点的widows的事件响应,计划使用热键的形式来实现.System中维护一个热键的表,一个特定的按键对应一个特定的widows,当检测到特定的按键时,调用对应windows的回调函数.

 

明天写完这些功能,再搞定中文输入,代码估计就可以打包放上来了.

抱歉!评论已关闭.