閱讀441 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Cocos2dx 3.0 過渡篇(六)中文顯示的一種解決辦法

尊重原創,轉載請注明來自:star特530的CSDN博客 https://blog.csdn.net/start530/article/details/18740733

想必大家應該都遇到過這種情況,在VS下編寫代碼時需要在Label顯示中文時,代碼如下:

  1. auto m_label = LabelTTF::create("新年快樂!","Arial",25);  
  2. m_label->setPosition(Point(100,100));  
  3. this->addChild(m_label);  

調試時發現m_label顯示的是一串匪夷所思的亂碼,這就說明模擬器並不支持中文的顯示方式(其實我發現自己很多詞句的描述方式不夠嚴謹,大家看得懂就好)。我曾經有試圖解決這個問題,但都以失敗告終。最後再請教一些大神時才恍然大悟:原來寫這種代碼應該養成一種好的習慣,就是不要直接在代碼裏將中文打進去,而是應該將遊戲中會用到的中文語句寫到一個文檔中,當需要使用到中文時再到文檔中讀取。這種方式不僅解決了中文顯示的問題,也方便以後語句的修改。

 

下麵我就以plist文檔為例吧。

假設有一個名為 Chinese.plist 的文檔,裏麵的內容是xml格式的,如下:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  3. <plist version="1.0">  
  4. <array>  
  5.     <dict>  
  6.         <key>id</key>  
  7.         <string>10</string>  
  8.         <key>info</key>  
  9.         <string>新年快樂!</string>  
  10.     </dict>  
  11.     <dict>  
  12.         <key>id</key>  
  13.         <string>20</string>  
  14.         <key>info</key>  
  15.         <string>馬上有錢!</string>  
  16.     </dict>  
  17. </array>  
  18. </plist>  

接下來就講解下如何提取這些中文。

1、 先讀取plist文檔到array

  1. auto array_plist = Array::createWithContentsOfFile("Chinese.plist");  

2、 創建一個字典來提取“新年快樂!”這幾個字

  1. for(int i=0;i<array_plist->count();i++)  
  2. {  
  3.     auto dic = (Dictionary*)array_plist->getObjectAtInder(i);//獲取array_plist中的第一個對象  
  4.     int key_id = 10;//因為在plist文檔中,“新年快樂!”對應的id是10  
  5.     int key_id_plist = ((String*)dic->objForKey("id"))->intValue();//獲取字典中“id”的數值,將String型的轉成整型的  
  6.     if(key_id == key_id_plist)  
  7.     {  
  8.         std::string info_str = ((String*)dic->objForKey("info"))->getString();//如果兩個id相等,說明找到了想要獲得的那個對象,然後提取key值為“info"的信息  
  9.     }  
  10. }  

3、 好了,方法就是上述這樣,應該還蠻簡單的吧。下麵寫段完整的代碼,將“新年快樂!”,“馬上有錢”都顯示出來。

  1. auto array_plist = Array::createWithContentsOfFile("Chinese.plist");  
  2.   
  3. std::string info1;//存儲新年快樂的字符串  
  4. std::string info2;//存儲馬上有錢的字符串  
  5.   
  6. for(int i=0;i<array_plist->count();i++)  
  7. {  
  8.     auto dic = (Dictionary*)array_plist->getObjectAtInder(i);//獲取array_plist中的第一個對象  
  9.     int key_id1 = 10;//因為在plist文檔中,“新年快樂!”對應的id是10  
  10.     int key_id2 = 20;//馬上好運的id  
  11.     int key_id_plist = ((String*)dic->objForKey("id"))->intValue();//獲取字典中“id”的數值,將String型的轉成整型的  
  12.     if(key_id1 == key_id_plist)  
  13.     {  
  14.         info_str1 = ((String*)dic->objForKey("info"))->getString();//獲得”新年快樂“文字  
  15.         continue;  
  16.     }  
  17.     if(key_id2 == key_id_plist)  
  18.     {  
  19.         info_str2 = ((String*)dic->objForKey("info"))->getString();//獲得”馬上有錢“文字  
  20.         continue;  
  21.     }  
  22. }  
  23.   
  24. auto label_1 = LabelTTF::create(info_str1,"Arial",25);  
  25. label_1->setPosition(Point(100,100);  
  26. this->addChild(label_1,1);  
  27.   
  28. auto label_2 = LabelTTF::create(info_str2,"Arial",25);  
  29. label_2->setPosition(Point(100,200));  
  30. this->addChild(label_2,1);  

恩,運行效果應該是像下麵這樣的……………………..

額,其實我代碼是在word裏寫的,所以也沒去調試對不對

~~


明天周六,放假一天。又可以搞下微信公眾平台了。


轉載請注明地址:https://blog.csdn.net/start530/article/details/18740733

最後更新:2017-04-03 12:56:08

  上一篇:go Cocos2dx 3.0 過渡篇(七)EditBox和ControlSlider不得不說的故事
  下一篇:go HDFS HA: 高可靠性分布式存儲係統解決方案的曆史演進