[cocos2dx 3.0 (三)] 中文支持显示 + 自制ScrollLabel类

来源:互联网 发布:苏宁易购 抢券软件 编辑:程序博客网 时间:2024/05/17 07:52

关于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 UTF8static 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 UTF8static 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 situationdest.push_back(0x80| ((w >> 12) & 0x3f));dest.push_back(0x80| ((w >> 6) & 0x3f));dest.push_back(0x80| (w & 0x3f));}*/elsedest.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){//初始化背景LayerColorif(!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宏就能添加文本消息了。

下面结合中文显示下效果:



                             


能学一点是一点,保持乐观心态吐舌头

0 0
原创粉丝点击