cocos2d-x 中文显示问题的解决方案 (自己封装一个类一次编写终身无忧)

来源:互联网 发布:iphone照片直接导入mac 编辑:程序博客网 时间:2024/05/18 00:54

之前一直都是用XML文件来解决中文显示问题。。。。

不过xml文件解决中文问题有个致命的缺陷,就是不能按照自己的意愿动态显示需要的内容。。

(比如我们在做棋牌游戏中需要动态显示 ,豹子,对子,散牌等)这样就不利于中文显示的函数封装;所以这种方法应该摒弃!!


所以我决定自己封转一个类用于中文的转码  (支持gbk 和 UTF-8);

下面我来写一下着了类的实现过程

#pragma once
#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;
}

//大家只需要在相应的游戏层中接受这个返回值就行了,还是给个实例吧;




这样在以后的编程中直接使用这个类就好了,希望能对大家有所帮助!