游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7058|回复: 9

CEGUI中文显示问题的解决方法

[复制链接]

7

主题

36

帖子

51

积分

注册会员

Rank: 2

积分
51
发表于 2007-7-11 11:44:00 | 显示全部楼层 |阅读模式
见到论坛上有好多朋友困惑于CEGUI无法显示和输入中文的问题。输入问题暂且不说,起码显示中文应该不难吧。我研究了两天,其间不知用了多少遍Google,跑到CEGUI和OGRE的官方网站和论坛找了很久,都没有太多的帮助。也看了打工仔写的相关文档,但是好像需要修改源代码,然后重新编译。难道CEGUI的最新版0.5.1还不支持中文吗?!最后只好自己一点一点摸索。谁知竟然真的被我摸到了,呵呵。下面我就说一说,怎样用CEGUI显示中文。

本教程只是对中文显示做出一些说明,对于其他问题请参阅其他相关文档。本教程使用OgreSDK中的Demo_Ocean为例。

第一步,我们需要准备一个中文字体,我选用的是Window XP系统自带的simhei.ttf(这个字体在系统文件夹WINDOWS\Fonts中可以找到)。我们需要把它复制到Ogre安装目录中media下的fonts目录中(例如:C:\OgreSDK\media\fonts),这个fonts目录中存放有例子中需要用到的字体文件。
第二步,我们需要准备一个simhei-12.font文件,这个文件可以用记事本编辑,然后保存到Ogre安装目录中media下的gui目录中(例如:C:\OgreSDK\media\gui),其内容如下:

<?xml version="1.0"?>
<Font Name="SimHei-12" Filename="simhei.ttf" Type="FreeType" Size="12"
NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>

注意:切记不要写<GlyphSet>段,我最初在网上看到有朋友给出的教程有这个段的内容,说是将你的程序中需要用的字加在这个段中。但是,据我实验得出的结论是,如果加入这个<GlyphSet>段,会导致创建字体时发生异常,根据CEGUI.log中的提示,是“Glyphs is unknown”。
第三步,检查一下resources.cfg,看看上面用到的fonts和gui两个目录的路径是否正确,如果你是使用SDK的话应该没问题。
第四步,修改OceanDemoCegui.config,将原来的BlueHighway-12修改为SimHei-12。注意:大小写不要写错。
第五步,修改TaharezLookSkin.scheme,在

<Font Name="BlueHighway-12" Filename="bluehighway-12.font" />

之前,增加我们的中文字体说明

<Font Name="SimHei-12" Filename="simhei-12.font" />

注意:大小写不要写错。
第六步,打开OceanDemo.cpp,我们要将左下角的状态统计说明的Current FPS,Avarage FPS,Worst FPS,Best FPS,Triangle Count这几项改成当前帧数:,平均帧数:,最差帧数:,最优帧数:,三角形数:。找到OceanDemo_FrameListener::updateStats,看到了吧。我们将原先的

static CEGUI::String currFps =  "Current FPS: ";
static CEGUI::String avgFps = "Avarage FPS: ";
static CEGUI::String bestFps = "Best FPS: ";
static CEGUI::String worstFps = "Worst FPS: ";
static CEGUI::String tris = "Triangle Count: ";

修改为

static CEGUI::String currFps =  (CEGUI::utf8*)Ogre::UTFString(L"当前帧率:").asUTF8_c_str();
static CEGUI::String avgFps = (CEGUI::utf8*)Ogre::UTFString(L"平均帧率:").asUTF8_c_str();
static CEGUI::String bestFps = (CEGUI::utf8*)Ogre::UTFString(L"最优帧率:").asUTF8_c_str();
static CEGUI::String worstFps = (CEGUI::utf8*)Ogre::UTFString(L"最差帧率:").asUTF8_c_str();
static CEGUI::String tris = (CEGUI::utf8*)Ogre::UTFString(L"三角形数:").asUTF8_c_str();

最后要注意的是,凡是见到汉字的地方都要保存为Unicode(UTF-8)格式。我用VS2005在 文件-高级保存选项 中选择Unicode(UTF-8 带签名)。
好了,都做完了。编译链接一下看看吧。
PS:用layout文件预制gui时可以直接把Text 的value设置为汉字如:

&ltroperty Name="Text" value="当前帧率:" />

同样也要保存为utf-8。
sf_2007711114352.jpg

6

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2007-7-26 15:44:00 | 显示全部楼层

Re: CEGUI中文显示问题的解决方法

应该说明一下:楼主的ogre是1.4.3版本的,只有1.4.3版本中才会支持Ogre::UTFString

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2008-6-8 09:44:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

楼主,现在这个东西不行啦,有没有更新方案啊?

17

主题

737

帖子

743

积分

高级会员

Rank: 4

积分
743
发表于 2008-6-13 13:29:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

我用的1.4.7版,UTFString可以用。谢谢楼主。

另外发现加载中文字体好像很慢,猜想它是不是要把每个字都转成图像了。。。怎么能快点呢?

2

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2008-6-20 11:14:00 | 显示全部楼层

Re: Re:CEGUI中文显示问题的解决方法

lcy03406: Re:CEGUI中文显示问题的解决方法

我用的1.4.7版,UTFString可以用。谢谢楼主。

另外发现加载中文字体好像很慢,猜想它是不是要把每个字都转成图像了。。。怎么能快点呢?


使用占空间比较小的字体 比如仿宋 可以快一些

3

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-6-24 15:00:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

不过用1.4.7用truetype字数一多字体会变的很模糊,不知道这个是什么原因

7

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-8-22 10:43:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

我用的是1.4.9版本的,按这种方法还是显示不了中文???为什么啊??

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2009-3-5 13:39:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

我用最新版本的也可以显示,就是有点慢,换个字体再试下

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2009-3-5 13:52:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

我发现不用换字体,把字的大小换一下,改成8号字就好多了

8

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
发表于 2009-3-16 09:55:00 | 显示全部楼层

Re:CEGUI中文显示问题的解决方法

不论几号字体,开启防锯齿项,效果很好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 03:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表