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

关于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宏就能添加文本消息了。

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



                             


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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值