您的位置:首页 > 移动开发 > Cocos引擎

Cocos2dx 学习随笔(一) Cocos2dx 3.x 读取plist文件 ValueVector 与 ValueMap的使用

2014-07-30 17:47 441 查看
今天忙完手头工作,看了许多大牛的博客,心血来潮,决定从今天起开始写我的博客。哈哈,很期待后面的日子里会蹦出怎样的火花~ 废话少说先入正题。

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);
4000

addChild(label3);
label3->setPosition(Vec2(300,300));

auto label4 = Label::create(vec_3,"",30);
addChild(label4);
label4->setPosition(Vec2(300,200));
运行结果:



哈哈,好了,这回真的结束了,也是我的处女作,有不明白的地方可以留言,有写错的地方也请大牛们指出~ 今后的日子里我们共同努力加油!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息