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);
代码可以直接到上面这个链接去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);
相关文章推荐
- Ogre 代码分析 -- 关于中文字体分析OgreFont
- Ogre 代码分析 -- 关于中文字体分析OgreFont
- vs中release模式调试和错误:CA0503:无法显示额外的代码分析警告或错误
- Toast执行完makeText之后的代码不执行(子线程中调用Toast显示异常分析)
- 从代码分析Android-Universal-Image-Loader的图片加载、显示流程
- lk 中的显示驱动代码分析
- DataGridView控件显示行号的正确代码及分析
- 一段代码让你学会Qt的中文显示,以及文件打开,保存操作
- android4.0 的图库Gallery2代码分析(四) 之相册的数据处理以及显示
- Android Studio 导入 Eclipse 的代码后,注释和运行时中文显示乱码
- magento -- 修改代码让后台属性组合里的属性显示中文
- OGre(1.65)+CEGUI的中文显示和中文输入,新人必看
- Nano-X显示系统的代码分析
- Confluence PDF导出不显示中文,导出Word图片及代码显示
- php 显示中文乱码问题分析
- php中文乱码问题以及页面显示部分后台代码问题
- php中文乱码问题以及页面显示部分后台代码问题
- php中文乱码问题以及页面显示部分后台代码问题
- [导入]OGRE显示中文
- JavaScript 显示中文日期原代码