您的位置:首页 > 编程语言

Ogre 代码分析 -- 中文显示

2010-03-05 09:15 295 查看
本来打算分析一下OgreFont的代码,然后自己用FreeType写一个图片解析类那,但在网上找到了解决办法,作为别人的成果在这贡献下连接 http://hi.baidu.com/_invasion/blog/item/5f6590ca35d80ff552664faf.html

代码可以直接到上面这个链接去Copy 也可以到Ogre3d.org上去下载,上面这个链接还有工具的

但关于这个代码,有需要修改的地方,没有做居中处理,绑定节点后偏移了一点

修改这个函数:void MovableText::_setupGeometry()

float left = 0;

下面把关于名字公告板管理类贴出来吧:

使用方法:

MoveTextManager* billboardMgr = MoveTextManager::getSingletonPtr();
if(!billboardMgr)
throw Ogre::Exception(10,"管理器未初始化在USER","My Excaption");

//生成玩家名字公告版
billboardMgr->AddNameBillboard(_sName,_sName,0.2,ColourValue::Green);
//显示公告板到玩家节点
billboardMgr->attachNode(_sNodeName,_sName,-8.8);
//billboardMgr->setFontColour(_sName,ColourValue::Blue);

//============ManagerNameBillboard.h=============

#ifndef __include_ManagerNameBillboard_h__
#define __include_ManagerNameBillboard_h__

#include <map>
#include "Ogre.h"
using namespace Ogre;
using namespace std;

namespace Ogre
{
class MovableText;
}
class MoveTextManager:public Ogre::Singleton<MoveTextManager>
{
public:
typedef std::map<Ogre::String,MovableText*> MoveTextBillboardMap;
typedef std::map<Ogre::String,MovableText*>::iterator MoveTextBillboardMapIter;

MoveTextManager(SceneManager* sMgr);
~MoveTextManager();

/** fun : 设置公告版可见--全部不可见
* param : bool true代表可见
* return : void
*/
void setVisible(bool isshow=true);

/** fun : 设置单个名字公告板的可见
* param : nodename 节点名称
* param : isshow 是否可见 调用这个函数默认为不可见
* return : void
*/
void setVisible(Ogre::String nodeName,bool isshow=false);

/** fun : 绑定到节点显示一个公告版
* param : namdeName 要绑定节点的文字名称
* param : billboardname 需要绑定的公告版文字关键字
* return : void
*/
void attachNode(Ogre::String nodeName,Ogre::String billboardname,Real height=100);

/** fun : 绑定到节点显示一个公告版
* param : namdeName 要绑定节点名称
* param : billboardname 需要绑定的公告版文字关键字
* return : void
*/
void attachNode(SceneNode* nodeName,Ogre::String billboardname,Real height=100);

/** fun : 添加一个新的名字公告版到关联容器
* param : billboardname 关联关键字,也是公告唯一的名称
* param : caption 需要显示的文字标题
* param : size 单个字体的宽度
* param : fontcolor 字体显示的颜色
* return : void
*/
void AddNameBillboard(Ogre::String billboardName,Ogre::DisplayString caption,Real size=10,ColourValue fontcolor=ColourValue::White);

/** fun : 删除一个名字公告版,通过关联容器关键字
* param : billname 公告版唯一名称,关联容器的关键字
* return : void
*/
void DestoryNameBillboard(Ogre::String billname);

/** fun : 删除所有节点公告板
* param : void
* return : void
*/
void DestoryAllNameBillboard();

/** fun : 设置字体颜色
* param : 名字公告板名称
* param : ColourValue
* return : void
**/
void setFontColour(Ogre::String bilboardName,Ogre::ColourValue value = Ogre::ColourValue::Green);

/** fun : 设置字体颜色
* param : 公告板指针
* param : 颜色值
* return : void
*/
void setFontColour(Ogre::MovableText* obj,Ogre::ColourValue value = Ogre::ColourValue::Green);
protected:
SceneManager* m_psceneMgr;
MoveTextBillboardMap m_namebillboardMap;
bool m_bIsShow;

private:
};
#endif //__include_ManagerNameBillboard_h__



//============ManagerNameBillboard.cpp=============

#include "ManagerNameFontBillboard.h"
#include "MovableText.h"

template<> MoveTextManager* Ogre::Singleton<MoveTextManager>::ms_Singleton = 0;

MoveTextManager::MoveTextManager(SceneManager* sMgr)
:m_psceneMgr(sMgr)
,m_bIsShow(true)
{

}

MoveTextManager::~MoveTextManager()
{
DestoryAllNameBillboard();
}

void MoveTextManager::setVisible(bool isshow/* =true */)
{
for (MoveTextBillboardMapIter i = m_namebillboardMap.begin();i != m_namebillboardMap.end();i++)
{
setVisible((*i).first,isshow);
}
}
void MoveTextManager::setVisible(Ogre::String nodeName,bool isshow/* =false */)
{
SceneNode* tempnode=m_psceneMgr->getSceneNode(nodeName);
assert(!tempnode);
tempnode->setVisible(isshow);
}
void MoveTextManager::attachNode(Ogre::String nodeName,Ogre::String billboardname,Real height)
{
SceneNode* tempNode = m_psceneMgr->getSceneNode(nodeName);
SceneNode* attNode = tempNode->createChildSceneNode(billboardname,Vector3(0,tempNode->getPosition().y+height,0));

MoveTextBillboardMapIter i=m_namebillboardMap.find(billboardname);

assert(m_namebillboardMap.end() != i);

attNode->attachObject((*i).second);
}
void MoveTextManager::attachNode(SceneNode* nodeName,Ogre::String billboardname,Real height/* =100 */)
{
SceneNode* attNode = nodeName->createChildSceneNode(billboardname,Vector3(0,nodeName->getPosition().y+height,0));

MoveTextBillboardMapIter i = m_namebillboardMap.find(billboardname);

assert(m_namebillboardMap.end() != i);

attNode->attachObject((*i).second);

}
void MoveTextManager::AddNameBillboard(Ogre::String billboardName,Ogre::DisplayString caption,Real size/*=10*/,ColourValue fontcolor/*=ColourValue::White*/)
{
//MovableText* m_pNameBillboard=new MovableText(billboardName,caption,"simhei",size,fontcolor);
MovableText* m_pNameBillboard=new MovableText(billboardName,caption,"Game",size,fontcolor);
m_pNameBillboard->showOnTop(true);
m_pNameBillboard->setTextAlignment(MovableText::H_CENTER , MovableText::V_CENTER);
m_namebillboardMap.insert(MoveTextBillboardMap::value_type(billboardName,m_pNameBillboard));
m_pNameBillboard->setQueryFlags(1<<17);
}
void MoveTextManager::DestoryNameBillboard(Ogre::String billname)
{
MoveTextBillboardMapIter i=m_namebillboardMap.find(billname);

assert(m_namebillboardMap.end() != i);

MovableText* delet = (*i).second;
delete delet;
SceneNode* temp = m_psceneMgr->getSceneNode(billname);
m_psceneMgr->destroySceneNode(temp);
m_namebillboardMap.erase(i);
}
void MoveTextManager::DestoryAllNameBillboard()
{
for (MoveTextBillboardMapIter i = m_namebillboardMap.begin(); i != m_namebillboardMap.end();++i)
{
delete (*i).second;
SceneNode* temp = m_psceneMgr->getSceneNode((*i).first);
m_psceneMgr->destroySceneNode(temp);
}
m_namebillboardMap.clear();
}

void MoveTextManager::setFontColour(Ogre::String bilboardName, Ogre::ColourValue value /*= Ogre::ColourValue::Green*/ )
{
MovableText* tmp = 0;
MoveTextBillboardMapIter ni;
if((ni = m_namebillboardMap.find(bilboardName))!= m_namebillboardMap.end())
{
tmp = ni->second;
tmp->setColor(value);
}
}

void MoveTextManager::setFontColour( Ogre::MovableText* obj,Ogre::ColourValue value /*= Ogre::ColourValue::Green*/ )
{
if(!obj)
obj->setColor(value);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: