plist文件实际上就是xml文件,默认情况下,我用TexturePacker生成的纹理中会对应一个plist文件,通过plist文件的信息,可以知道纹理中各个小图片的位置和大小。我生成的plist文件如下图:
cocos2dx对解析这类的文件提供了不错的支持:
/**************************
*PlistUtil.h
****************************/
#ifndef __PlistUtil_H__
#define __PlistUtil_H__
#include "cocos2d.h"
USING_NS_CC;
class PlistUtil:public CCObject
{
public:
/* 获取工具对象,单例方式 */
static PlistUtil* sharedPlistUtil();
/* 初始化 */
bool init();
/* 加载配置文件,在读取一个新配置文件之前要调一次 */
void loadFile(const char* sPath);
/* 释放配置文件,配置文件用完后应该马上调用它释放资源 */
void releaseFile(const char* sPath);
/* 根据图片名称从纹理图中获取图片的位置和大小,便于精灵批量绘制*/
CCRect getResourceRect(const char* resourceName,const char* filePath);
private:
/* 单例对象*/
static PlistUtil* mPlistUtil;
/*
存放mFileDictt-filePath的字典。
这样写比较好记忆:CCDictionary<CCArray<CCArray>, const char*>
*/
CCDictionary* mFileDict;
};
#endif
/******************************
*PlistUtil.cpp
******************************/
#include "PlistUtil.h"
PlistUtil* PlistUtil::mPlistUtil = NULL;
PlistUtil* PlistUtil::sharedPlistUtil(){
if(mPlistUtil == NULL) {
mPlistUtil = new PlistUtil();
if(mPlistUtil && mPlistUtil->init()) {
mPlistUtil->autorelease();
}
else {
CC_SAFE_DELETE(mPlistUtil);
mPlistUtil = NULL;
}
}
return mPlistUtil;
}
bool PlistUtil::init(){
/* 初始化成员变量 */
mFileDict = CCDictionary::create();
mFileDict->retain();
return true;
}
void PlistUtil::loadFile(const char* sPath)
{
CCDictionary* plistDic = CCDictionary::createWithContentsOfFile(sPath);
if(NULL!=plistDic)
{
CCDictionary* frames=dynamic_cast<CCDictionary*>(plistDic->objectForKey("frames"));
if(NULL!=frames)
{
mFileDict->setObject(frames,sPath);
}
}
}
void PlistUtil::releaseFile( const char* sPath )
{
mFileDict->removeObjectForKey(sPath);
}
CCRect PlistUtil::getResourceRect(const char* resourceName,const char* filePath)
{
CCDictionary* frames=(CCDictionary*)mFileDict->objectForKey(filePath);
if(NULL!=frames)
{
CCDictionary* tmpDict=dynamic_cast<CCDictionary*>(frames->objectForKey(resourceName));
if(NULL!=tmpDict)
{
return CCRectFromString(
dynamic_cast<CCString*>(tmpDict->objectForKey("frame"))->getCString());
}
}
return CCRectMake(0,0,0,0);
}