关于cocos2dx 中文显示问题,查了网上的一些资料后了解了不少,最后还是认为如果要显示的字符不是很多的话,还是放到xml文件中跟key关联来获取,但是如果放到xml很不方便的话,就使用下面的类就好了,不需要在加入什么库,也不需要担心平台问题。
第一次的代码有点小错误 , 现在已经改好了, 拿去可以直接用。
#ifndef _SUPPORT_TOOL_H_
#define _SUPPORT_TOOL_H_
//
#include "cocos2d.h"
//
#define A2U(varString) wSupportTool::AStrToUTF8(varString).c_str() //用于显示中文(窄字符)
#define W2U(varString) wSupportTool::WStrToUTF8(varString).c_str() //用于显示中文(宽字符)
//
class wSupportTool
{
public:
//string to UTF8
static std::string AStrToUTF8(const string& src)
{
std::string curLocale=setlocale(LC_ALL,NULL);
setlocale(LC_ALL, "");
int len=src.length()+1;
wchar_t *str =new wchar_t[len];
int total=mbstowcs(str,src.c_str(),len);
str[total]=0;
std::wstring wstr=str;
delete[] str;
setlocale(LC_ALL, curLocale.c_str());
return WStrToUTF8(wstr);
}
//wstring to UTF8
static std::string WStrToUTF8( const wstring& src)
{
std::string dest;
for (size_t i = 0; i < src.size(); i++){
wchar_t w = src[i];
if (w <= 0x7f)
dest.push_back((char)w);
else if (w <= 0x7ff){
dest.push_back(0xc0 | ((w >> 6)& 0x1f));
dest.push_back(0x80| (w & 0x3f));
}
else if (w <= 0xffff){
dest.push_back(0xe0 | ((w >> 12)& 0x0f));
dest.push_back(0x80| ((w >> 6) & 0x3f));
dest.push_back(0x80| (w & 0x3f));
}
/*else if (sizeof(wchar_t) > 2 && w <= 0x10ffff){
dest.push_back(0xf0 | ((w >> 18)& 0x07)); // wchar_t 4-bytes situation
dest.push_back(0x80| ((w >> 12) & 0x3f));
dest.push_back(0x80| ((w >> 6) & 0x3f));
dest.push_back(0x80| (w & 0x3f));
}*/
else
dest.push_back('?');
}
return dest;
}
};
#endif
加入这个类后,只要在使用中文的时候,加上A2U或W2U宏就好了
//
LabelTTF::create(A2U("这是一个Label!"), "Arial", 14);
log(A2U("这是一条log!"));
//
string Astr=A2U("欢迎来到这个世界!");
log(Astr.c_str());
LabelTTF::create(Astr, "Arial", 14);
//
LabelTTF::create(W2U(L"这是一个Label!"), "Arial", 14);
log(W2U(L"这是一条log!"));
//
string Wstr=W2U(L"欢迎来到这个世界!");
log(Wstr.c_str());
LabelTTF::create(Wstr, "Arial", 14);
在制作游戏时可能要用到滚动的label,可以把一些消息信息提示给用户。
这里重载LayerColor作为背景。并且需要用到cocos2dx中的ScrollView滚动视图类,让一个label可滚动。使用ScrollView需要加入头文件#include "cocos-ext.h",并且添加附加依赖项libExtensions.lib.
.h:
#ifndef _WSCROLL_LABEL_H_
#define _WSCROLL_LABEL_H_
#include "cocos2d.h"
#include "cocos-ext.h"
//
#define AddMSG(varString) wScrollLabel::getInstance()->addString(varString);//在ScrollLabel添加string
//
USING_NS_CC;
USING_NS_CC_EXT;
using namespace std;
#define MARGIN 5 //边距
class wScrollLabel : public LayerColor
{
public:
wScrollLabel(void);
~wScrollLabel(void);
//获取实例方便调用
static wScrollLabel* getInstance();
//创建通过尺寸、背景颜色、初始文本
static wScrollLabel* createScrollLabel(Size size,Color4B &BGColor,const string&initText);
//创建通过尺寸、背景颜色、初始文本、字体类型、字体大小
static wScrollLabel* createScrollLabel(Size size,Color4B &BGColor,const string&initText,const string&fontName,float fontSize);
bool initScrollLabel(Size size,Color4B &BGColor,const string&initText,const string&fontName,float fontSize);
//添加字符串
void addString(const string&str);
void setTextColor(const Color3B&color);
void setTextFontSize(float fontSize);
void setTextFontName(const string&fontName);
protected:
CC_SYNTHESIZE(LabelTTF*, _label,Label);
CC_SYNTHESIZE(ScrollView*,_scrollView,ScrollView);
float _maxContextOverHeight;
static wScrollLabel* _curScrollLabel;
//CC_SYNTHESIZE(Layer*,_containerLayer,ContainerLayer);
};
#endif
.cpp:
#include "wScrollLabel.h"
wScrollLabel::wScrollLabel(void)
{
}
wScrollLabel::~wScrollLabel(void)
{
}
wScrollLabel* wScrollLabel::_curScrollLabel=NULL;
wScrollLabel* wScrollLabel::getInstance()
{
return _curScrollLabel;
}
wScrollLabel* wScrollLabel::createScrollLabel(Size size,Color4B &BGColor,const string&initText)
{
wScrollLabel* pRet=new wScrollLabel;
if(pRet && pRet->initScrollLabel(size,BGColor,initText,"Arial",12))
{
pRet->autorelease();
_curScrollLabel=pRet;
return pRet;
}
else
{
delete pRet;
return NULL;
}
}
wScrollLabel* wScrollLabel::createScrollLabel(Size size,Color4B &BGColor,const string&initText,const string&fontName,float fontSize)
{
wScrollLabel* pRet=new wScrollLabel;
if(pRet && pRet->initScrollLabel(size,BGColor,initText,fontName,fontSize))
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
_curScrollLabel=pRet;
return NULL;
}
}
bool wScrollLabel::initScrollLabel(Size size,Color4B &BGColor,const string&initText,const string&fontName,float fontSize)
{
//初始化背景LayerColor
if(!initWithColor(BGColor,size.width,size.height))
return false;
_maxContextOverHeight=100;
//创建一个label
_label=LabelTTF::create(initText,fontName,fontSize,Size(size.width-MARGIN*2,0),TextHAlignment::LEFT);
_label->setAnchorPoint(Point(0,0));
//创建一个ScrollView,以label为容器
_scrollView=ScrollView::create(Size(size.width-MARGIN*2,size.height-MARGIN*2),_label);
_scrollView->setDirection(ScrollView::Direction::VERTICAL);//设置为仅垂直可滚动
_scrollView->setContentOffset(Point(0,getContentSize().height-MARGIN*2-_label->getContentSize().height));
this->addChild(_scrollView,1);
_scrollView->setPosition(Point(getPosition().x+MARGIN,getPosition().y+MARGIN));
return true;
}
void wScrollLabel::addString(const string&str)
{
string orgString=_label->getString();//获取原来的字符串
float conHeight=getContentSize().height;//获取文本高度
//判断文本高度是否超出范围
if(_label->getContentSize().height>conHeight-MARGIN*2+_maxContextOverHeight)
{
//超出则删除头部一行
orgString.erase(0,orgString.find('\n')+1);
//log(orgString.c_str());
}
//
_label->setString(orgString+"\n"+str);
Size textSize=_label->getContentSize();
if(textSize.height<conHeight)
{
//如果文本高度大于可显示高度,则显示文本末尾
_scrollView->setContentOffset(Point(0,conHeight-MARGIN*2-textSize.height));
}
else
{
_scrollView->setContentOffset(Point(0,0));
}
}
void wScrollLabel::setTextColor(const Color3B&color)
{
_label->setColor(color);
}
void wScrollLabel::setTextFontSize(float fontSize)
{
_label->setFontSize(fontSize);
}
void wScrollLabel::setTextFontName(const string&fontName)
{
_label->setFontName(fontName);
}
在场景中创建实例之后,只要加入头文件,使用AddMSG宏就能添加文本消息了。
下面结合中文显示下效果:
能学一点是一点,保持乐观心态