学习 Cocos2d-x 有一阵了,如今要作个小东西,第一步就遇到了文字展现的问题,因而想把可能遇到的问题通通整理一下。这一部分也不局限于wp8,全平台应该都是一个解决方案。安全
先在脑壳里大体想了一下,大体也就分为两个部分,第一部分是普通文字如何展现,第二部分是老大难的中文展现问题。app
文本显示控件 编辑器
Cocos2d-x 中使用 Label 来展现文字,看 官方介绍 能够知道,一共有三种类型的Label ,分别是 CCLabelTTF 、CCLabelBMFont 、LabelAtlas ,下面逐个来介绍下:ide
CCLabelTTF
工具
优点:性能
一、能够调整任意大小,支持间距调整学习
二、不须要额外的编辑器字体
劣势: ui
一、建立和更新很缓慢,由于每次修改都要从新贴图编码
使用实例:
//
最基本的使用
CCLabelTTF* pLabel = CCLabelTTF::create(
"
Hello World
",
"
Arial
",
24);
//
指定水平、垂直对齐
pLabel = CCLabelTTF::create(
"
Hello World
",
"
Arial
",
24, CCSizeMake(
200,
160), kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop);
//换行.
CCLabelTTF *center = CCLabelTTF::create("word wrap \n \"testing\" (bla0) bla1 'bla2' [bla3] (bla4) {bla5} {bla6} [bla7] (bla8) [bla9] 'bla0' \"bla1\"",
"Paint Boy",
32,
CCSizeMake(s.width,200),
kCCTextAlignmentCenter,
kCCVerticalTextAlignmentTop);
CCLabelBMFont
BMFont 即 Bitmap Font ,使用位图来表现字体,通常生成2个文件,一个是字体 *.fnt 文件,一个是图片 png文件。
建立过程能够参考 这篇文章
优点:
一、建立和更新十分的快
二、字体能够更加的个性化~
劣势:
一、 要依赖额外的工具来建立,好比 Windows 下能够用这个 BMFont
二、 调整尺寸的时候 显示效果可能变差
使用实例:
//
基本使用,要求要显示的字符必须在字体图片里出现
CCLabelBMFont* pLable = CCLabelBMFont::create(
"
中国
",
"
fonts/bitmapFontChinese.fnt
");
pLable->setPosition(ccp(size.width /
2, size.height /
2));
//BMFont的每个元素能够转化为 CCSprite,单独作特效处理
CCLabelBMFont *label = CCLabelBMFont::create(
"
Bitmap Font Atlas
",
"
fonts/bitmapFontTest.fnt
");
addChild(label);
CCSprite* BChar = (CCSprite*) label->getChildByTag(
0);
//更新值.
CCLabelBMFont *label1 = (CCLabelBMFont*) getChildByTag(kTagBitmapAtlas1);
label1->setString(string);
CCLabelAtlas
优势:同CCLabelBMFont
缺点:字符是固定大小,若是不想要固定大小的,就要用CCLabelBMFont
这个应该是速度最快的了,但是已经不被推荐了,如今还出现只是为了向后兼容。
使用实例:
//基本用法,参数都封装在plist里
CCLabelAtlas* label1 = CCLabelAtlas::create(
"
123 Test
",
"
fonts/tuffy_bold_italic-charmap.plist
");
addChild(label1,
0, kTagSprite1);
//
另一种初始化的方法,指定png,和单位的宽高.
CCLabelAtlas* label1 = CCLabelAtlas::create(
"
123 Test
",
"
fonts/tuffy_bold_italic-charmap.png
",
48,
64,
'
');
//
更新值.
CCLabelAtlas* label1 = (CCLabelAtlas*)getChildByTag(kTagSprite1);
label1->setString(
string);
官方文档还提到了个 CharMapFile 的概念
CharMapFile 就是咱们以前初始化 CCLabelAtlas 用到的图片,它有几个要求:
一、不能超过256个字符
二、单位的宽度就是字符的宽度,用像素表示
三、单位的高度就是字符的高度,一样用像素表示
CCLabelFont 和 CCLabelAtlas 效率要高的缘由是,他们会把全部的元素都放在一张纹理上,这样,无论你建立多少个 Label 纹理仍是一张,而 CCLabelTTF 不一样,每一个Label 都会单独有个纹理,因此性能就会降低不少,并且要占用更多的内存。
关于中文的显示
虽然游戏开发通常要面向国际,可是咱们作东西要没有中文支持只有英文版本那就是舍本逐末了。若是咱们什么处理都不作,直接在初始化Label的时候,输入中文,会发现没法正常显示,这是由于咱们编码的字符集是GB2312,cocos2d-x的字符集是UTF-8,所以若是想要正常显示,咱们能够采起以下几种方式。
一、转码,这个最简单,也最直接。
//
GB2312 转 UTF-8
char* HelloWorld::G2U(
const
char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP,
0, gb2312, -
1, NULL,
0);
wchar_t* wstr =
new wchar_t[len+
1];
memset(wstr,
0, len+
1);
MultiByteToWideChar(CP_ACP,
0, gb2312, -
1, wstr, len);
len = WideCharToMultiByte(CP_UTF8,
0, wstr, -
1, NULL,
0, NULL, NULL);
char* str =
new
char[len+
1];
memset(str,
0, len+
1);
WideCharToMultiByte(CP_UTF8,
0, wstr, -
1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
二、 采用xml的方式来读取,它的好处是修改起来更方便一些,并且很容易作多语言适配,testCpp里也有这个例子,代码以下。
///
BMFontUnicode
BMFontUnicode::BMFontUnicode()
{
CCDictionary *strings = CCDictionary::createWithContentsOfFile(
"
fonts/strings.xml
");
const
char *chinese = ((CCString*)strings->objectForKey(
"
chinese1
"))->m_sString.c_str();
const
char *japanese = ((CCString*)strings->objectForKey(
"
japanese
"))->m_sString.c_str();
const
char *russian = ((CCString*)strings->objectForKey(
"
russian
"))->m_sString.c_str();
const
char *spanish = ((CCString*)strings->objectForKey(
"
spanish
"))->m_sString.c_str();
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelBMFont *label1 = CCLabelBMFont::create(spanish,
"
fonts/arial-unicode-26.fnt
",
200, kCCTextAlignmentLeft);
addChild(label1);
label1->setPosition(ccp(s.width/
2, s.height/
5*
4));
CCLabelBMFont *label2 = CCLabelBMFont::create(chinese,
"
fonts/arial-unicode-26.fnt
");
addChild(label2);
label2->setPosition(ccp(s.width/
2, s.height/
5*
3));
CCLabelBMFont *label3 = CCLabelBMFont::create(russian,
"
fonts/arial-26-en-ru.fnt
");
addChild(label3);
label3->setPosition(ccp(s.width/
2, s.height/
5*
2));
CCLabelBMFont *label4 = CCLabelBMFont::create(japanese,
"
fonts/arial-unicode-26.fnt
");
addChild(label4);
label4->setPosition(ccp(s.width/
2, s.height/
5*
1));}
xml 内容,固然也要保存为 UTF-8格式的。
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"
>
<
plist
version
="1.0"
>
<
dict
>
<
key
>chinese1
</
key
>
<
string
>美好的一天
</
string
>
<
key
>japanese
</
key
>
<
string
>良い一日を
</
string
>
<
key
>russian
</
key
>
<
string
>Хорошего дня
</
string
>
<
key
>spanish
</
key
>
<
string
>Buen día
</
string
>
</
dict
>
</
plist
>
三、修改cpp文件的编码
默认的编码是GB2312,这就是形成文字没法显示的问题,若是在win32平台下,改为 utf-8 编码就能够了,可是wp8上却不能够,不知道为何,须要特地的改为utf-8 without signature,
可是这是一种最快速也最不安全的方法, 有可能会出现莫名其妙的没法编译经过,因此很是不建议。
好了,文字的部分基本也就这些了, 下一部分,应该考虑考虑如何作 多分辨率 适配了。
参考文章:
http://blog.csdn.net/zhy_cheng/article/details/9736973
http://cocos2d-x.org/wiki/Text_Labels?project_id=cocos2d-x
欢迎有兴趣的童鞋加入Cocos2d-x 开发群 qq: 264152376