Copyright © MikeFeng QQ: 76848502
在OGRE引擎中使用中文需要面对几个问题:
在CEGUI中使用中文
在输入框中处理IME消息
在Overlay中使用中文
本文解决的是第一个问题,即在CEGUI中使用中文
CEGUI插件在OGRE中的使用方法:
Step 1: 初始化CEGUI::OgreCEGUIRenderer和CEGUI::System
例如
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow,
Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative)
Step 2: 加载scheme,并设置鼠标和字体的默认值
例如
CEGUI::SchemeManager::getSingleton().loadScheme(
(CEGUI::utf8*)"TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor(
(CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
CEGUI::FontManager::getSingleton().createFont("simhei.font");
mGUISystem->setDefaultFont((CEGUI::utf8*)"simhei");
这里的TaharezLookSkin.scheme在Samples/Media/gui中附带了,定义了一些控件的字体,样式。因为我们需要使用中文字体,所以可以拷贝一个simhei.ttf的字体到gui目录。然后编写simhei.font,参照其他.font文件的定义依葫芦画瓢即可。具体如下:
<?xml version="1.0" ?>
<Font Name="simhei" Filename="simhei.ttf" Type="FreeType" Size="10" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
其中Name=”simhei”属性很重要,因为setDefaultFont的参数就是这个。
Step3: 加载layout
例如
CEGUI::Window* sheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout(
(CEGUI::utf8*)"Demo8.layout");
mGUISystem->setGUISheet(sheet);
注意loadWindowLayout中的参数.layout文件一定要和Step2中loadScheme一致,就是说.layout中控件的样式需要在loadScheme中已经定义过,否则CEGUI就会报错。顺便提一下Samples/Common/bin/Debug/*.log都很有用,在程序出莫名异常的时候可以跟踪。因此别忘了在程序中设置生成log。Demo8.layout是一个UTF8格式的文件(头三个字节是EF BB BF),其中包含了一些中文,有一行是这样的:(这个是免费打工仔提供的中文补丁包中的)
<Property Name="Text" Value="杀人游戏房间" />
你可以自己更改自带的layout文件,注意添加中文之后必须保存成UTF8格式。
代码如下:
#include
<CEGUI/CEGUI.h>
#include
<CEGUI/CEGUIImageset.h>
#include
<CEGUI/CEGUISystem.h>
#include
<CEGUI/CEGUILogger.h>
#include
<CEGUI/CEGUISchemeManager.h>
#include
<CEGUI/CEGUIWindowManager.h>
#include
<CEGUI/CEGUIWindow.h>
#include
<CEGUI/CEGUIPropertyHelper.h>
#include
<CEGUI/elements/CEGUICombobox.h>
#include
<CEGUI/elements/CEGUIListbox.h>
#include
<CEGUI/elements/CEGUIListboxTextItem.h>
#include
<CEGUI/elements/CEGUIPushButton.h>
#include
<CEGUI/elements/CEGUIScrollbar.h>
#include
"OgreCEGUIRenderer.h"
#include
"OgreCEGUIResourceProvider.h"
#include
"ExampleApplication.h"
class
Demo : public ExampleApplication
{
private
:
CEGUI::OgreCEGUIRenderer* mGUIRenderer;
CEGUI::System* mGUISystem;
public
:
Demo() {}
~Demo()
{
//if(mEditorGuiSheet)
//{
// CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
//}
if(mGUISystem)
{
delete mGUISystem;
mGUISystem = 0;
}
if(mGUIRenderer)
{
delete mGUIRenderer;
mGUIRenderer = 0;
}
}
protected
:
// Just override the mandatory create scene method
void createScene(void)
{
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow,
Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
// load scheme and set up defaults
CEGUI::SchemeManager::getSingleton().loadScheme(
(CEGUI::utf8*)"TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor(
(CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
CEGUI::FontManager::getSingleton().createFont("simhei.font");
mGUISystem->setDefaultFont((CEGUI::utf8*)"simhei");
CEGUI::Window* sheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout(
(CEGUI::utf8*)"Demo8.layout");
mGUISystem->setGUISheet(sheet);
// set the mouse cursor initially in the middle of the screen
mGUISystem->injectMousePosition((float)mWindow->getWidth() / 2.0f, (float)mWindow->getHeight() / 2.0f);
}
};