今天忙完手头工作,看了许多大牛的博客,心血来潮,决定从今天起开始写我的博客。哈哈,很期待后面的日子里会蹦出怎样的火花~ 废话少说先入正题。
Cocos2dx从3.x开始,对Dictionary做了改变,当然现在想用也不是不可以,有关3.x和2.x 的差异可以看看这篇博客:http://blog.csdn.net/star530/article/details/37834689
所以对应的读取plist文件的方式也改变了。
首先看下新出现的两个新类型,ValueVector 与 ValueMap,我这里用的Cocos2dx-3.2版本,先看一下代码
ValueVector:
typedef std::vector<Value> ValueVector;
ValueMap:
typedef std::unordered_map<std::string, Value> ValueMap;
可以看到人如其名,一个是vector,一个是map,一看就明白他们的特性了,需要特别提醒的一点是:ValueVector和ValueMap中只能存放Value类型,Value类型是什么?看下CCValue.h啦~~ 在这就不多说了。回到我们的主题,那么在什么情况下用哪个,读取的plist文件时又有什么区别呢?咱们继续。
下面介绍一下plist文件的格式:
<?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对应一个value
<key>id</key>
<string>1</string>
<key>info</key>
<string>我是Info1</string>
</dict>
<dict>
<key>id</key>
<string>2</string>
<key>info</key>
<string>我是Info2</string>
</dict>
</array>
</plist>
我们只用到这2个格式,所以其他格式也想了解下就点这里:http://blog.csdn.net/wanliaixie/article/details/13614069
介绍到这里,有的童鞋可能已经明白了~ 哈哈, 下面上代码:
当我们读取有array类型的plist文件:
<?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>
<string>1</string>
<string>我是Info1</string>
<string>2</string>
<string>我是Info2</string>
</array>
</plist>
使用下面的代码读取:
// ValueVector
ValueVector vec = FileUtils::getInstance()->getValueVectorFromFile("c.plist");
std::string vec_0 = vec.at(0).asString();
std::string vec_1 = vec.at(1).asString();
std::string vec_2 = vec.at(2).asString();
std::string vec_3 = vec.at(3).asString();
auto label1 = Label::create(vec_0,"",30);
addChild(label1);
label1->setPosition(Vec2(300,500));
auto label2 = Label::create(vec_1,"",30);
addChild(label2);
label2->setPosition(Vec2(300,400));
auto label3 = Label::create(vec_2,"",30);
addChild(label3);
label3->setPosition(Vec2(300,300));
auto label4 = Label::create(vec_3,"",30);
addChild(label4);
label4->setPosition(Vec2(300,200));
运行效果如下:
当我们读取有dict类型的plist文件:
<?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>id1</key>
<string>10</string>
<key>info1</key>
<string>我是Info1</string>
<key>id2</key>
<string>20</string>
<key>info2</key>
<string>我是Info2</string>
</dict>
</plist>
使用下面的代码读取:
// ValueMap
ValueMap map = FileUtils::getInstance()->getValueMapFromFile("c.plist");
std::string map_info_0 = map.at("id1").asString();
std::string map_info_1 = map.at("info1").asString();
std::string map_info_2 = map.at("id2").asString();
std::string map_info_3 = map.at("info2").asString();
auto label1 = Label::create(map_info_0,"",30);
addChild(label1);
label1->setPosition(Vec2(300,500));
auto label2 = Label::create(map_info_1,"",30);
addChild(label2);
label2->setPosition(Vec2(300,400));
auto label3 = Label::create(map_info_2,"",30);
addChild(label3);
label3->setPosition(Vec2(300,300));
auto label4 = Label::create(map_info_3,"",30);
addChild(label4);
label4->setPosition(Vec2(300,200));
运行结果如下:
OK,到此我们就愉快的讲完了。 那么有的童鞋又有疑问了:喂!等等 !!我看到的plist文件 array 和 dict 都有的,那怎么办???
哦,别急嘛,我是说基础讲完了~
我们再来看下文章开始提到的plist文件:
<?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对应一个value
<key>id</key>
<string>100</string>
<key>info</key>
<string>我是Info1</string>
</dict>
<dict>
<key>id</key>
<string>200</string>
<key>info</key>
<string>我是Info2</string>
</dict>
</array>
</plist>
注意一下,因为array是在最外侧,也就是说下面的两个dict都是array的子节点(不知道这么说标不标准,但这么理解没错啦~),所以我们要从根节点开始读取,也就是要用getValueVectorFromFile()来获取根,而后再将子节点转换成dict字典类型,Cocos2dx为我们封装了两个转换函数可以转换Value类型:asValueMap() 和 asValueVector()。
下面我们看下代码:
// ValueVector & ValueMap
ValueVector vec = FileUtils::getInstance()->getValueVectorFromFile("c.plist");
ValueMap vec_map_0 = vec.at(0).asValueMap();
std::string vec_0 = vec_map_0.at("id").asString();
std::string vec_1 = vec_map_0.at("info").asString();
ValueMap vec_map_1 = vec.at(1).asValueMap();
std::string vec_2 = vec_map_1.at("id").asString();
std::string vec_3 = vec_map_1.at("info").asString();
auto label1 = Label::create(vec_0,"",30);
addChild(label1);
label1->setPosition(Vec2(300,500));
auto label2 = Label::create(vec_1,"",30);
addChild(label2);
label2->setPosition(Vec2(300,400));
auto label3 = Label::create(vec_2,"",30);
addChild(label3);
label3->setPosition(Vec2(300,300));
auto label4 = Label::create(vec_3,"",30);
addChild(label4);
label4->setPosition(Vec2(300,200));
运行结果:
哈哈,好了,这回真的结束了,也是我的处女作,有不明白的地方可以留言,有写错的地方也请大牛们指出~ 今后的日子里我们共同努力加油!!!