【Cocos2d-x for WP8 學習整理】(5)文字顯示全整理

學習 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( 200160), 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 "4864'   ');

// 更新值.
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

相關文章
相關標籤/搜索