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

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

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));
运行结果:



哈哈,好了,这回真的结束了,也是我的处女作,有不明白的地方可以留言,有写错的地方也请大牛们指出~ 今后的日子里我们共同努力加油!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值