论坛上有好多朋友困惑于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),其内容如下:
注意:切记不要写段,我最初在网上看到有朋友给出的教程有这个段的内容,说是将你的程序中需要用的字加在这个段中。但是,据我实验得出的结论是,如果加入这个段,会导致创建字体时发生异常,根据CEGUI.log中的提示,是“Glyphs is unknown”。
第三步,检查一下resources.cfg,看看上面用到的fonts和gui两个目录的路径是否正确,如果你是使用SDK的话应该没问题。
第四步,修改OceanDemoCegui.config,将原来的BlueHighway-12修改为SimHei-12。注意:大小写不要写错。
第五步,修改TaharezLookSkin.scheme,在????之前,增加我们的中文字体说明
注意:大小写不要写错。
第六步,打开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设置为汉字如:
同样也要保存为utf-8。
见到论坛上有好多朋友困惑于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),其内容如下:
注意:切记不要写段,我最初在网上看到有朋友给出的教程有这个段的内容,说是将你的程序中需要用的字加在这个段中。但是,据我实验得出的结论是,如果加入这个段,会导致创建字体时发生异常,根据CEGUI.log中的提示,是“Glyphs is unknown”。
第三步,检查一下resources.cfg,看看上面用到的fonts和gui两个目录的路径是否正确,如果你是使用SDK的话应该没问题。
第四步,修改OceanDemoCegui.config,将原来的BlueHighway-12修改为SimHei-12。注意:大小写不要写错。
第五步,修改TaharezLookSkin.scheme,在
之前,增加我们的中文字体说明
注意:大小写不要写错。
第六步,打开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设置为汉字如:
同样也要保存为utf-8。