欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

【Cocos2d-x for WP8 学习整理】(5)文字显示全整理

来源: 开发者 投稿于  被查看 2293 次 评论:262

【Cocos2d-x for WP8 学习整理】(5)文字显示全整理


学习 Cocos2d-x 有一阵了,现在要做个小东西,第一步就遇到了文字展示的问题,于是想把可能遇到的问题统统整理一下。这一部分也不局限于wp8,全平台应该都是一个解决方案。

先在脑袋里大致想了一下,大致也就分为两个部分,第一部分是普通文字如何展示,第二部分是老大难的中文展示问题。

Cocos2d-x 中使用 Label 来展示文字,看 官方介绍 可以知道,一共有三种类型的Label ,分别是 CCLabelTTF 、


优势:

1、可以调整任意大小,支持间距调整

2、不需要额外的编辑器

劣势: 

1、创建和更新很缓慢,因为每次修改都要重新贴图

CCLabelTTF* pLabel = CCLabelTTF::create();

pLabel = CCLabelTTF::create(, CCSizeMake(), 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);

 

 

BMFont 即 Bitmap Font ,使用位图来表现字体,一般生成2个文件,一个是字体 *.fnt 文件,一个是图片 png文件。

创建过程可以参考 这篇文章 

优势:

1、创建和更新十分的快

2、字体可以更加的个性化~

劣势: 

1、 要依赖额外的工具来创建,比如 Windows 下可以用这个 BMFont

2、 调整尺寸的时候 显示效果可能变差

使用实例:

CCLabelBMFont* pLable = CCLabelBMFont::create();
pLable->setPosition(ccp(size.width / , size.height /));

CCLabelBMFont *label = CCLabelBMFont::create();
addChild(label);
    
CCSprite* BChar = (CCSprite*) label->getChildByTag();

 

//更新值. 

CCLabelBMFont *label1 = (CCLabelBMFont*) getChildByTag(kTagBitmapAtlas1);

 

优点:同CCLabelBMFont 

缺点:字符是固定大小,如果不想要固定大小的,就要用CCLabelBMFont  

使用实例:

 

CCLabelAtlas* label1 = CCLabelAtlas::create();
addChild(label1, , kTagSprite1);

CCLabelAtlas* label1 = CCLabelAtlas::create();

CCLabelAtlas* label1 = (CCLabelAtlas*)getChildByTag(kTagSprite1);
label1->setString(); 

 

官方文档还提到了个 

CharMapFile 就是我们之前初始化 CCLabelAtlas 用到的图片,它有几个要求:

1、不能超过256个字符

2、单位的宽度就是字符的宽度,用像素表示

3、单位的高度就是字符的高度,同样用像素表示


CCLabelFont 和 CCLabelAtlas 效率要高的原因是,他们会把所有的元素都放在一张纹理上,这样,不管你创建多少个 Label 纹理还是一张,而 CCLabelTTF 不同,每个Label 都会单独有个纹理,所以性能就会下降很多,而且要占用更多的内存。

 

虽然游戏开发一般要面向国际,但是我们做东西要没有中文支持只有英文版本那就是舍本逐末了。

 

1、转码,这个最简单,也最直接。 

* HelloWorld::G2U( * gb2312)  
{  
  len = MultiByteToWideChar(CP_ACP, , gb2312, -, NULL, );  
 wchar_t* wstr =  wchar_t[len+];  
 memset(wstr, , len+);  
 MultiByteToWideChar(CP_ACP, , gb2312, -, wstr, len);  
 len = WideCharToMultiByte(CP_UTF8, , wstr, -, NULL, , NULL, NULL);  
 * str =  [len+];  
 memset(str, , len+);  
 WideCharToMultiByte(CP_UTF8, , wstr, -, str, len, NULL, NULL);  
 (wstr) delete[] wstr;  
  str;  

 


2、 采用xml的方式来读取,它的好处是修改起来更方便一些,而且很容易做多语言适配,testCpp里也有这个例子,代码如下。

BMFontUnicode::BMFontUnicode()
{
    CCDictionary *strings = CCDictionary::createWithContentsOfFile();

      *chinese  = ((CCString*)strings->objectForKey())->m_sString.c_str();
      *japanese = ((CCString*)strings->objectForKey())->m_sString.c_str();
      *russian  = ((CCString*)strings->objectForKey())->m_sString.c_str();
      *spanish  = ((CCString*)strings->objectForKey())->m_sString.c_str();


    CCSize s = CCDirector::sharedDirector()->getWinSize();

    CCLabelBMFont *label1 = CCLabelBMFont::create(spanish, , kCCTextAlignmentLeft);
    addChild(label1);
    label1->setPosition(ccp(s.width/, s.height/*));

    CCLabelBMFont *label2 = CCLabelBMFont::create(chinese, );
    addChild(label2);
    label2->setPosition(ccp(s.width/, s.height/*));

    CCLabelBMFont *label3 = CCLabelBMFont::create(russian, );
    addChild(label3);
    label3->setPosition(ccp(s.width/, s.height/*));

    CCLabelBMFont *label4 = CCLabelBMFont::create(japanese, );
    addChild(label4);
    label4->setPosition(ccp(s.width/, s.height/*));}


xml 内容,当然也要保存为 UTF-8格式的。





    chinese1
    美好的一天
    japanese
    良い一日を
    russian
    Хорошего дня
    spanish
    Buen día


3、修改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

 


 


相关频道:

用户评论