尊重原创,转载请注明来自:star特530的CSDN博客 http://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" "http://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里写的,所以也没去调试对不对…
过~~
明天周六,放假一天。又可以搞下微信公众平台了。
转载请注明地址:http://blog.csdn.net/start530/article/details/18740733