zoukankan      html  css  js  c++  java
  • 【Cocos2d-x for WP8 学习整理】(5)文字显示全整理

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

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

    文本显示控件                                                                                 

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

    CCLabelTTF 

    优势:

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

    2、不需要额外的编辑器

    劣势: 

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

    使用实例: 

    //最基本的使用
    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World""Arial"24);

    //指定水平、垂直对齐
    pLabel = CCLabelTTF::create("Hello World""Arial"24, CCSizeMake(200160), kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop);

    //换行. 

    CCLabelTTF *center = CCLabelTTF::create("word wrap "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文件。

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

    优势:

    1、创建和更新十分的快

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

    劣势: 

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

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

    使用实例:

    //基本使用,要求要显示的字符必须在字体图片里出现
    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"4864' ');

    //更新值.
    CCLabelAtlas* label1 = (CCLabelAtlas*)getChildByTag(kTagSprite1);
    label1->setString(string);  

    官方文档还提到了个 CharMapFile 的概念

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

    1、不能超过256个字符

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

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


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

    关于中文的显示                                                                                  

    虽然游戏开发一般要面向国际,但是我们做东西要没有中文支持只有英文版本那就是舍本逐末了。如果我们什么处理都不做,直接在初始化Label的时候,输入中文,会发现无法正常显示,这是因为我们编码的字符集是GB2312,cocos2d-x的字符集是UTF-8,因此如果想要正常显示,我们可以采取如下几种方式。

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

    //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;  

    } 


    2、 采用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> 


    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

    欢迎有兴趣的童鞋加入Cocos2d-x 开发群  qq: 264152376


  • 相关阅读:
    Spring--IOC--AOP
    SpringMVC
    elasticsearch为什么检索快?
    linux下无法启动webdriver问题
    python 日志组件
    纯js脚本操作excel
    箭头函数
    Vue与React对比
    Vue Router 路由懒加载
    Vue Router 路由守卫:完整的导航解析流程
  • 原文地址:https://www.cnblogs.com/jeekun/p/3389605.html
Copyright © 2011-2022 走看看