cocos2d-x 中文显示问题的解决方案 (自己封装一个类一次编写终身无忧)
之前一直都是用XML文件来解决中文显示问题。。。。
不过xml文件解决中文问题有个致命的缺陷,就是不能按照自己的意愿动态显示需要的内容。。
(比如我们在做棋牌游戏中需要动态显示 ,豹子,对子,散牌等)这样就不利于中文显示的函数封装;所以这种方法应该摒弃!!
所以我决定自己封转一个类用于中文的转码 (支持gbk 和 UTF-8);
下面我来写一下着了类的实现过程
#pragma once
#pragma comment(lib, "libiconv.lib") //加入转码库(这个是必须要加的)
#include "cocos2d.h"
#include "iconv\iconv.h" //包含具体的转码头文件 (这个也是)
#pragma comment(lib, "libiconv.lib") //加入转码库(这个是必须要加的)
#include "cocos2d.h"
#include "iconv\iconv.h" //包含具体的转码头文件 (这个也是)
class TransToC //自定义转码类
{
public:
TransToC(void);
~TransToC(void);
//声明转码函数
int GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode);
//声明使用转码过程(这里定义成节点类型返回这个节点,大家需要做的只是this->addChild(该节点))
cocos2d::CCNode* createChineseLabel(std::string str ,int fontsize ,int x,int y); //这几个参数分别代表 : 中文内容,字体 ,和要在场景中显示的坐标
};
//在cpp文件中这样定义
#include "TransToC.h"
USING_NS_CC;
TransToC::TransToC(void)
{
}
TransToC::~TransToC(void)
{
}
int TransToC::GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode)
{
iconv_t iconvH;
iconvH = iconv_open(fromCode, toCode);
if (iconvH == 0)
{
return -1;
}
const char* strChar = gbkStr.c_str();
const char** pin = &strChar;
size_t strLength = gbkStr.length();
char* outbuf = (char*) malloc(strLength*4);
char* pBuff = outbuf;
memset( outbuf, 0, strLength*4);
size_t outLength = strLength*4;
if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength))
{
iconv_close(iconvH);
return -1;
}
gbkStr = pBuff;
iconv_close(iconvH);
return 0;
}
CCNode* TransToC::createChineseLabel(std::string str ,int fontsize ,int x,int y)
{
GBKToUTF8(str,"gbk","utf-8");
CCLabelTTF* pLabel2 = CCLabelTTF::create(str.c_str(),"Marker Felt",fontsize);
pLabel2->setPosition(ccp(x, y));
return pLabel2;
}
USING_NS_CC;
TransToC::TransToC(void)
{
}
TransToC::~TransToC(void)
{
}
int TransToC::GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode)
{
iconv_t iconvH;
iconvH = iconv_open(fromCode, toCode);
if (iconvH == 0)
{
return -1;
}
const char* strChar = gbkStr.c_str();
const char** pin = &strChar;
size_t strLength = gbkStr.length();
char* outbuf = (char*) malloc(strLength*4);
char* pBuff = outbuf;
memset( outbuf, 0, strLength*4);
size_t outLength = strLength*4;
if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength))
{
iconv_close(iconvH);
return -1;
}
gbkStr = pBuff;
iconv_close(iconvH);
return 0;
}
CCNode* TransToC::createChineseLabel(std::string str ,int fontsize ,int x,int y)
{
GBKToUTF8(str,"gbk","utf-8");
CCLabelTTF* pLabel2 = CCLabelTTF::create(str.c_str(),"Marker Felt",fontsize);
pLabel2->setPosition(ccp(x, y));
return pLabel2;
}
//大家只需要在相应的游戏层中接受这个返回值就行了,还是给个实例吧;
这样在以后的编程中直接使用这个类就好了,希望能对大家有所帮助!