您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x中中文显示问题解决方法一

2012-11-09 20:12 375 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。
/article/8218514.html

在VS上使用cocos2d-x开发,中文显示会出问题。下面是解决的方法一(通过xml配置文件来读取中文)

------------------------------------------------代码部分----------------------------------------------------------

(1)stringsScript.xml(配置文件,自己写配置文件时就按照下面的格式来,调用时通过userName)

<?xml version="1.0" encoding="utf-8"?>
<stringsScriptRoot>
<userName>用户名:</userName>
</stringsScriptRoot>


(2)Singleton.h

#ifndef __SINGLETON_H__
#define __SINGLETON_H__

template <typename T>
class Singleton
{
public:
inline static T* getInstance();
inline static void release();
private:
static T* t;
};

template <typename T>
inline T* Singleton<T>::getInstance()
{
if (!t)
{
t = new T;
}
return t;
}

template<typename T>
inline void Singleton<T>::release()
{
if (t)
{
delete t;
t = 0;
}
}

template <typename T>
T* Singleton<T>::t = 0;

#endif // __SINGLE_H__


(3)HXmlParse.h

#ifndef HAnimation_HXmlParse_h
#define HAnimation_HXmlParse_h

#include "cocos2d.h"
using namespace cocos2d;

#include <map>
using namespace std;

class HXmlParse : public CCObject, public CCSAXDelegator
{
public:
HXmlParse()/*:isJumpHeadData(false)*/{}

static HXmlParse* parserWithFile(const char *tmxFile);

bool initHXmlParse(const char* xmlName);

//  使用 CCSAXDelegator 重写3个回调函数
void startElement(void *ctx, const char *name, const char **atts);

void endElement(void *ctx, const char *name);

void textHandler(void *ctx, const char *ch, int len);

std::string root_name;

//bool isJumpHeadData;

//CCMutableDictionary<std::string,CCString*> *mDic;
map<std::string, std::string>	m_mapText;

private:

std::string startXmlElement;//用来记录每个key前字段

std::string endXmlElement;//用来记录每个key后字段

std::string currString;//记录每个value的值
};

#endif


(4)HXmlParse.cpp

#include "HXmlParse.h"
#include "cocos2d.h"

HXmlParse* HXmlParse::parserWithFile(const char *tmxFile)
{
HXmlParse *pRet = new HXmlParse();
if(pRet->initHXmlParse(tmxFile))
{
//pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}

bool HXmlParse::initHXmlParse(const char* xmlName)
{
//mDic = new CCMutableDictionary<std::string,CCString*>();

CCSAXParser _par;

if (false == _par.init("UTF-8") )
{
//CCLog("-----请使用utf-8格式!");
return false;
}
_par.setDelegator(this);
const char* _path = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(xmlName);
return _par.parse(_path);
}

//回调函数
void HXmlParse::startElement(void *ctx, const char *name, const char **atts)
{
CC_UNUSED_PARAM(ctx);

startXmlElement = (char*)name;

//if(!isJumpHeadData)
{
//跳过数据头
//CCLog("------跳过root name");
//isJumpHeadData=true;

root_name=startXmlElement;
}

//    CCLog("-startElement----%s",startXmlElement.c_str());
}

void HXmlParse::endElement(void *ctx, const char *name)
{
CC_UNUSED_PARAM(ctx);

endXmlElement = (char*)name;

if(endXmlElement==root_name)
{
//数据尾
//CCLog("读取xml结束");
//isJumpHeadData=false;

root_name="";
}

//    CCLog("-endElement----%s",endXmlElement.c_str());
}

//键值对的结束字段
void HXmlParse::textHandler(void *ctx, const char *ch, int len)
{
CC_UNUSED_PARAM(ctx);

currString=string((char*)ch,0,len);
CCString *ccStr =new CCString();//备注3
ccStr->m_sString=currString;
if(root_name!="")
{
//mDic->setObject(ccStr,startXmlElement);
m_mapText[startXmlElement] = ccStr->getCString();
//CCLog("-----key:%s, value:%s",startXmlElement.c_str(),mDic->objectForKey(startXmlElement)->m_sString.c_str());
}

//    CCLog("-textHandler----%s",currString.c_str());
}


(5)XMLConfig.h

#ifndef _XMLCONFIG_H_
#define _XMLCONFIG_H_

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

class XMLConfig : public HXmlParse, public Singleton<XMLConfig>
{
public:
XMLConfig();
~XMLConfig();

bool Load();

char* GetStringForKey(const char* sKey) const;

bool SetStringForKey(const char* sKey, std::string value);

private:
HXmlParse* m_pParse;
};

#endif // _XMLCONFIG_H_


(6)XMLConfig.cpp

#include "XMLConfig.h"

XMLConfig::XMLConfig()
:m_pParse(NULL)
{
}

XMLConfig::~XMLConfig()
{
m_pParse->release();
m_pParse = NULL;
}

char* XMLConfig::GetStringForKey(const char* sKey) const
{
//const_iterator常量迭代器,不得修改
map<std::string, std::string>::const_iterator it = m_pParse->m_mapText.find(sKey);
if (it != m_pParse->m_mapText.end())
return (char*)it->second.c_str();
return NULL;
}
bool XMLConfig::SetStringForKey(const char* sKey, std::string value)
{
map<std::string, std::string>::iterator it = m_pParse->m_mapText.find(sKey);
if ( it != m_pParse->m_mapText.end())
{
it->second = value;
return true;
}
else
{
it->second = "";
return false;
}
}
bool XMLConfig::Load()
{
m_pParse = parserWithFile("stringsScript.xml");

return true;
}


(7)调用部分(包含包含的头文件)

#include "XMLConfig.h"

//通过xml配置来读取中文
XMLConfig::getInstance()->Load();
char * userName=XMLConfig::getInstance()->GetStringForKey("userName");
CCLabelTTF * chineseLabel = CCLabelTTF::create(userName,"Thonburi",25);
chineseLabel->setAnchorPoint(CCPointZero);
chineseLabel->setPosition(ccp(300, 600));
this->addChild(chineseLabel,2);



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: