首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

CEGUI 实现 RichEdit解决办法

2012-02-08 
CEGUI 实现 RichEdit半个月前如跳蚤一般东窜西跳找源码,可惜没有找到。现在自己做了个,还未完工,bug很多,先

CEGUI 实现 RichEdit
半个月前如跳蚤一般东窜西跳找源码,可惜没有找到。现在自己做了个,还未完工,bug很多,先写一下自己的做法,不足之处请高手不吝赐教,指点一下。

需求:
  CEGUI-0.7.1 实现游戏聊天框,要支持动态表情,超链接,换字体,换文字颜色,文字编辑

实现:
  cegui中有个MultiLineEditBox,可以编辑文字,但是不支持表情和超链接。有个StaticText支持静态表情和窗口混编,文字颜色也支持,但不能编辑。
  我现把他们合起来,做一个richedit控件。先把MultiLineEditBox复制过来改名RichEdit。创建新类RichEditRenderedStringParser,负责文本解析,解析的文本放RenderedString中。去掉MultiLineEditBox原来的文字处理方法,用RenderedString做描画(借鉴StaticText的做法),以实现丰富的文本,图片等显示。RenderedString中加入文字处理相关函数,为实现文本编辑提供帮助。
  RichEditRenderedStringParser解析过的文本放在RenderedString::d_components中,component本来有3种不同类型:RenderedStringTextComponent,RenderedStringImageComponent, RenderedStringWidgetComponent。我给他增加一种RenderedStringAnimatedImageComponent来表示动画。原先的RenderedStringWidgetComponent有个不知之处:窗口Component必须是编辑窗口的子窗口,而且必须事先创建, RenderedStringWidgetComponent不会创建和销毁窗口。

  动画实现:增加AnimatedImageInfo类,保存Image序列和每个Image的显示停留时间。增加AnimatedImage类,保存动画经过的时间,计算当前显示第几个Image,负责draw(调用Image的draw),每个AnimatedImage的实例对应一个屏幕上显示的动态图片。增加AnimatedImageManager类负责所有AnimatedImage的更新,如果发现有AnimatedImage当前显示图片改变了,则使CEGUI重画。

  目前未解决的问题是:
  1超链接没实现,打算用RenderedString的窗口Component实现,但要改RenderedStringWidgetComponent,使窗口Component独立于编辑窗口,要不然实现不了复制粘贴功能。不知道有什么好方法实现超链接。
  2动画效率太低,窗口中动画多了就会很卡,不知道CEGUI有什么好的方法实现动画。(每次动画换图片,CEGUI都要redraw,redraw太费时间了)

各位有什么好的建议?

[解决办法]
可能是因为很多人没有用过这个吧

无能为力了
[解决办法]
建议楼主去cegui官方论坛问问。前几年我在那报告了cegui的一个bug
[解决办法]
cegui太庞大,使用不方便,嘎嘎
[解决办法]
我在公司里做过与楼主要求一样的控件,不过使用0.5版本做的,就你的两个问题可以给你一点意见参考:

1:超链接其实很简单,你可以考虑一下MultiLineEditBox中光标是怎样移动到鼠标点击位置的,将控件设置成不可编辑的时候事实上鼠标点击到控件上还是会移动光标,之后就可以对光标位置的文字进行分析来获取你要的超链接信息了。

2:这个问题其实是你的思考方向错误,CEGUI中使用redraw方式来重绘窗口是可以的,但是重绘窗口中的元素效率太低了,建议修改CEGUI的图片渲染部分使其直接支持动态图片,这样就不止这一个控件可以用动态图片了,在我们的实际应用当中也是这样做的,修改过后我们的窗口边框等元素都具有了动态图片显示能力,效果很不错。

再多说几句吧,这个东西我是大学毕业刚进入公司大概三个月的时候,为了给任务窗口添加点击文字寻路的功能做的。由于当时的功能要求不高,也就显示几百字以及几个图片就可以,所以没有过多考虑效率问题,文字都是在设置进去的时候直接全部整理解析的。后来开发聊天界面的时候遇到了很严重的效率问题,因为聊天窗口文字是滚动的,不断增加的,而且要求聊天窗口可以拉伸,我记得当时那个控件在Release版当中显示1w字(不包含图片)的情况下拉伸窗口,客户端卡了20秒,于是对其进行重构,主要思想就是需要显示的整理,不需要显示的不理,重构用了两周时间,效率还不错,支持超链接功能与非链接区的鼠标穿透。这里只是想提醒你一下千万不要只实现功能而忽视其他效率,我对其重构的时候好痛苦~~~

热点排行