Cocos2dx 3.0 過渡篇(六)中文顯示的一種解決辦法
尊重原創,轉載請注明來自:star特530的CSDN博客 https://blog.csdn.net/start530/article/details/18740733
想必大家應該都遇到過這種情況,在VS下編寫代碼時需要在Label顯示中文時,代碼如下:
- auto m_label = LabelTTF::create("新年快樂!","Arial",25);
- m_label->setPosition(Point(100,100));
- this->addChild(m_label);
調試時發現m_label顯示的是一串匪夷所思的亂碼,這就說明模擬器並不支持中文的顯示方式(其實我發現自己很多詞句的描述方式不夠嚴謹,大家看得懂就好)。我曾經有試圖解決這個問題,但都以失敗告終。最後再請教一些大神時才恍然大悟:原來寫這種代碼應該養成一種好的習慣,就是不要直接在代碼裏將中文打進去,而是應該將遊戲中會用到的中文語句寫到一個文檔中,當需要使用到中文時再到文檔中讀取。這種方式不僅解決了中文顯示的問題,也方便以後語句的修改。
下麵我就以plist文檔為例吧。
假設有一個名為 Chinese.plist 的文檔,裏麵的內容是xml格式的,如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
- <plist version="1.0">
- <array>
- <dict>
- <key>id</key>
- <string>10</string>
- <key>info</key>
- <string>新年快樂!</string>
- </dict>
- <dict>
- <key>id</key>
- <string>20</string>
- <key>info</key>
- <string>馬上有錢!</string>
- </dict>
- </array>
- </plist>
接下來就講解下如何提取這些中文。
1、 先讀取plist文檔到array中
- auto array_plist = Array::createWithContentsOfFile("Chinese.plist");
2、 創建一個字典來提取“新年快樂!”這幾個字
- for(int i=0;i<array_plist->count();i++)
- {
- auto dic = (Dictionary*)array_plist->getObjectAtInder(i);//獲取array_plist中的第一個對象
- int key_id = 10;//因為在plist文檔中,“新年快樂!”對應的id是10
- int key_id_plist = ((String*)dic->objForKey("id"))->intValue();//獲取字典中“id”的數值,將String型的轉成整型的
- if(key_id == key_id_plist)
- {
- std::string info_str = ((String*)dic->objForKey("info"))->getString();//如果兩個id相等,說明找到了想要獲得的那個對象,然後提取key值為“info"的信息
- }
- }
3、 好了,方法就是上述這樣,應該還蠻簡單的吧。下麵寫段完整的代碼,將“新年快樂!”,“馬上有錢”都顯示出來。
- auto array_plist = Array::createWithContentsOfFile("Chinese.plist");
- std::string info1;//存儲新年快樂的字符串
- std::string info2;//存儲馬上有錢的字符串
- for(int i=0;i<array_plist->count();i++)
- {
- auto dic = (Dictionary*)array_plist->getObjectAtInder(i);//獲取array_plist中的第一個對象
- int key_id1 = 10;//因為在plist文檔中,“新年快樂!”對應的id是10
- int key_id2 = 20;//馬上好運的id
- int key_id_plist = ((String*)dic->objForKey("id"))->intValue();//獲取字典中“id”的數值,將String型的轉成整型的
- if(key_id1 == key_id_plist)
- {
- info_str1 = ((String*)dic->objForKey("info"))->getString();//獲得”新年快樂“文字
- continue;
- }
- if(key_id2 == key_id_plist)
- {
- info_str2 = ((String*)dic->objForKey("info"))->getString();//獲得”馬上有錢“文字
- continue;
- }
- }
- auto label_1 = LabelTTF::create(info_str1,"Arial",25);
- label_1->setPosition(Point(100,100);
- this->addChild(label_1,1);
- auto label_2 = LabelTTF::create(info_str2,"Arial",25);
- label_2->setPosition(Point(100,200));
- this->addChild(label_2,1);
恩,運行效果應該是像下麵這樣的……………………..
額,其實我代碼是在word裏寫的,所以也沒去調試對不對…
過~~
明天周六,放假一天。又可以搞下微信公眾平台了。
轉載請注明地址:https://blog.csdn.net/start530/article/details/18740733
最後更新:2017-04-03 12:56:08