欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ogre输出屏幕2d文字(Overlay文字)

程序员文章站 2024-03-25 20:04:22
...

转载自:http://blog.csdn.net/chunyexiyu/article/details/40961259


参考: http://www.cnblogs.com/wanghao111/archive/2009/08/11/1543495.html
参考:http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189795.html
参考:http://hghhe.blog.163.com/blog/static/3237756820097192512944
参考: Pro OGRE 3D Programming
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)


Ogre文字的生成方法分为:配置文件创建 和 程序创建两中. 两者异曲同工, 都是实现类似定义结构。

首先文字定义说明, 然后定义文字2d层,在层中添加container,再加TextArea.

OverlayManager --> OverlayContainer
OverlayContainer --> OverlayContainer / OverlayElement 
OverlayElement(PanelOverlayElement/BorderPanelOverlayElement/TextAreaOverlayElement)

其中配置文件配置比较简单,程序创建的比较灵活


配置文件创建Overlay文件

1. 配置文件创建-创建英文文字

如果在配置文件中创建的话,方法是:

例如

a. 在sample.fontdef中配置字体定义:
MyFont1
{
 type truetype
 source solo5.ttf
 size 16
 resolution 96
}
b. 创建sample.overlay,在里面定义

(注意:范围不能过大,否则可能不能正常展示)
(注意: material Core/StatsBlockCenter 为文字底色背景)

MyOverlay
{
    zorder 499
    container BorderPanel(MyContainer3)
    {
        metrics_mode pixels
        left 0
        top 10
        width 300
        height 200
        material Core/StatsBlockCenter

        element TextArea(MyTextArea3)
        {
            metrics_mode pixels
            top 10
            left 50
            width 200
            height 50
            font_name MyFont1
            char_height 19
            caption who am i
            colour_top 1 1 0.7
            colour_bottom 1 1 0.7
        }
    }
}
c. 需要在程序中对MyOverlay的显示
 // 加载字体
 Ogre::FontManager::getSingleton().getByName("MyFont1")->load();

 // 显示二维层
 Ogre::OverlayManager* p = Ogre::OverlayManager::getSingletonPtr();
 Ogre::Overlay* pOverlay = p->getByName("MyOverlay");
 pOverlay->show();

2. 配置文件创建-创建中文文字

创建中文文字的话,需要中文字库的支持
参考http://www.cnblogs.com/wanghao111/archive/2009/08/11/1543495.html这篇文章的介绍
例如使用simhei.ttf,添加几个文字

a. 在sample.fontdef中配置字体定义
MyChsFont1
{
    type truetype
    source simhei.ttf
    size 16
    resolution 96
    code_points 25105-25105 26159-26159 35841-35841 33-166
}

注意: code_points中为汉字和英文字母的unicode的wchar十进制值. 汉字字库比较大,全加载的话比较耗时.这种使用哪些加哪些的方法据说比较节省消耗.

b.在sample.overlay中定义
MyOverlay
{
    zorder 499
    container BorderPanel(MyContainer3)
    {
        metrics_mode pixels
        left 0
        top 10
        width 300
        height 200
        material Core/StatsBlockCenter

        element TextArea(MyTextArea4)
        {
            metrics_mode pixels
            top 70
            left 50
            width 200
            height 50
            font_name MyChsFont1
            char_height 19
            caption 我是谁
            colour_top 1 1 0.7
            colour_bottom 1 1 0.7
        }
    }
}
c.在程序中,加载这个字体
 // 加载字体
 Ogre::FontManager::getSingleton().getByName("MyChsFont1")->load();

 // 显示二维层
 Ogre::OverlayManager* p = Ogre::OverlayManager::getSingletonPtr();
 Ogre::Overlay* pOverlay = p->getByName("MyOverlay");
 pOverlay->show();

程序创建Overlay文字

例子如下:


// 参考http://hghhe.blog.163.com/blog/static/3237756820097192512944/
// 添加Font
Ogre::FontPtr font = Ogre::FontManager::getSingleton().create("MyCodeFont", "General");
font->setSource("simhei.ttf");  // 设置字体源
font->setType(FT_TRUETYPE);     // 设置字体类型
font->setTrueTypeSize(18);      // 设置字体大小: 生成纹理的大小,值越大生成纹理所花的时间也就越多
font->setTrueTypeResolution(96);// 设置字体的打印分辨率,一般为96
font->addCodePointRange(Font::CodePointRange(33,166));      // 设置英文-unicode的int值范围
font->addCodePointRange(Font::CodePointRange(19968,40869)); // 设置汉字-unicode的int值范围
font->load();   // 加载字体

// create an overlay and set the zorder of overlay
m_pOverlay= Ogre::OverlayManager::getSingleton().create("shapeName");
m_pOverlay->setZOrder(254);
m_pOverlay->show();

// create container and add to overlay
Ogre::OverlayContainer* m_pContainer = static_cast<Ogre::OverlayContainer*>     
    (Ogre::OverlayManager::getSingleton().createOverlayElement("BorderPanel", "container1"));
m_pContainer->setMetricsMode(GMM_RELATIVE);
m_pContainer->setPosition(0, 0);
m_pContainer->setWidth(0.2);
m_pContainer->setHeight(0.1);
m_pContainer->setMaterialName("Core/StatsBlockCenter");

// add container to overlay
m_pOverlay->add2D(m_pContainer);

// font load
Ogre::FontPtr pFont = Ogre::FontManager::getSingleton().getByName("MyFont");
pFont->load();

// add text area element to conainter
OverlayElement* textArea = OverlayManager::getSingleton().createOverlayElement("TextArea", "MyText");
textArea->setMetricsMode(GMM_RELATIVE);
textArea->setPosition(0, 0);
textArea->setWidth(0.2);
textArea->setHeight(0.1);
textArea->setParameter("font_name", "MyFont");  // simhei.ttf
textArea->setParameter("font_name", "MyCodeFont");  // simhei.ttf
textArea->setParameter("char_height", StringConverter::toString(Ogre::Real(0.05)));
textArea->setParameter("horz_align", "left");
textArea->setColour(Ogre::ColourValue(0.0, 1.0, 0.0));
textArea->setCaption(Ogre::DisplayString(L"Test三角形我的中国心\nTest\Test"));
m_pContainer->addChild(textArea);

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

原文结束!


补充:上文Unicode 的 int 值范围不包括中文标点符号,所以需要自己手动添加,代表中文标点的 int 值是不连续的:

font->addCodePointRange(Ogre::Font::CodePointRange(65288,65289));
font->addCodePointRange(Ogre::Font::CodePointRange(12304,12305));
font->addCodePointRange(Ogre::Font::CodePointRange(65374,65375));
font->addCodePointRange(Ogre::Font::CodePointRange(8544,8560));
font->addCodePointRange(Ogre::Font::CodePointRange(12280,12300));
font->addCodePointRange(Ogre::Font::CodePointRange(65270, 65350));

以上手动添加的是中文常用标点:小括号、逗号、句号、顿号、叹号、分号等。

相关标签: ogre