最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
Cocos2d-x数据模块教程04:plist文件操作
在Cocos2d-x中,plist文件是一种非常常见的配置文件,它实际上是特定格式的XML文件。例如,在将小图打包成大图的纹理图片、制作粒子特效、帧动画等场景中,都会用到plist文件作为配置文件。本章将详细介绍如何创建plist文件,以及如何读取plist文件中的数据信息。
【plist文件】
属性列表(Property List)文件用于存储序列化后的对象,其文件扩展名为 .plist,因此通常被称为plist文件。
1、plist文件在Cocos中的应用
- 图片纹理的配置信息:可以将多个纹理小图片打包成一个大图片,并生成对应的plist文件。该文件用于配置各个小图的名称、尺寸大小,以及在大图中的矩形区域位置等信息。可使用TexturePacker工具将多个小碎图的纹理打包成一张大图片。
- 帧动画的配置信息:将帧动画的数据信息生成为plist配置文件,其中包含每帧间隔、动画重复次数、每一帧所需的图片、每张图片的名称、尺寸大小,以及在大图中所在的矩形区域位置等信息。
- 粒子特效的配置信息:把粒子特效的数据信息生成为plist配置文件,涵盖粒子发射器的位置信息、发射器模式、最大粒子数量、发射角度、发射速度、纹理贴图等信息。
- 其他应用:除上述应用外,plist文件还有其他用途。
2、plist文件格式
plist文件为属性列表文件,类似于键值对(key - value)的形式。以下是一个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>dict</key>
<dict>
<key>name</key>
<string>Alice</string>
<key>age</key>
<string>20</string>
</dict>
<key>array</key>
<array>
<integer>0</integer>
<integer>1</integer>
<integer>2</integer>
</array>
<key>bool</key>
<true/>
<key>data</key>
<data></data>
<key>date</key>
<date>2015-02-16T16:47:11Z</date>
<key>number</key>
<integer>123456</integer>
<key>string</key>
<string>hello world!</string>
</dict>
</plist>
属性类型主要有以下几种:
- Dictionary:字典,子属性列表为键值对形式。
- Array:数组,子属性列表为数组值的形式。
- Boolean:逻辑值,取值为
true或false。 - Number:数字。
- String:字符串。
- Date:日期。
- Data:数据。
需要注意的是,根节点只能为字典或数组,并且在字典或数组中,键对应的值依然可以为以上的各个属性类型。
3、创建/编辑plist文件
在Mac OS系统中,XCode可以直接创建和编辑plist文件。当然,也可以使用专门的plist编辑软件,或直接使用文本编辑器进行编写。在XCode中编辑plist文件非常方便,根节点Root只能为Dictionary或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">
<dict>
<key>dict</key>
<dict>
<key>name</key>
<string>Alice</string>
<key>age</key>
<string>20</string>
</dict>
<key>array</key>
<array>
<integer>0</integer>
<integer>1</integer>
<integer>2</integer>
</array>
<key>bool</key>
<true/>
<key>data</key>
<data></data>
<key>date</key>
<date>2015-02-16T16:47:11Z</date>
<key>number</key>
<integer>123456</integer>
<key>string</key>
<string>hello world!</string>
</dict>
</plist>
4、读取plist文件
接下来介绍如何读取plist文件的数据信息:
- 根节点为Dictionary:使用
FileUtils::getInstance()->getValueMapFromFile()方法将其读取为一个ValueMap。 - 根节点为Array:使用
FileUtils::getInstance()->getValueVectorFromFile()方法将其读取为一个ValueVector。
以下是使用示例:
// 文件路径
std::string path = "/soft/cocos2d-x-3.4/projects/Demo34/Resources/testPlist.plist";
// 读取plist文件
// 以根节点为字典Dictionary为例
// 根节点为字典Dictionary, 读取为一个ValueMap
ValueMap plist = FileUtils::getInstance()->getValueMapFromFile(path);
// 若根节点为数组Array, 读取为一个ValueVector
// ValueVector plist = FileUtils::getInstance()->getValueVectorFromFile(path);
// 获取数据
// 读取 "string"
CCLOG("string = %s", (plist["string"].asString()).c_str());
// 读取 "dict", 也是一个字典ValueMap
ValueMap& dict = plist["dict"].asValueMap();
CCLOG("name = %s", (dict["name"].asString()).c_str());
CCLOG("age = %s", (dict["age"].asString()).c_str());
// 读取 "array", 是一个数组ValueVector
ValueVector& array = plist["array"].asValueVector();
for (int i = 0; i < array.size(); i++) {
Value& value = array[i];
CCLOG("%d", value.asInt());
}