[cocos2dx 3.0 (一)] 对文件读写操作 +FileUtils类

一直想学习下游戏编程,但总是没下定决心。现在就从Cocos2dx开始学习吧,以后也要坚持写些经验文章,就当是给我自己的学习历程的一个记录吧。

我现在下的cocos2dx版本是3.0beta2的,而网上的大多数教程都是2.x的,有些地方有些小不同,所以难免碰到点磕碰。但这些总是难免的,一下子就习惯了。

3.0没有了CC前缀,这样看起来果真是爽多了啊

cocos2dx的文件工具类FileUtils,用于对文件的简单操作,下面列出一些大概用得到的函数:

static FileUtils* getInstance();//获取FileUtils类的实例

cocos2dx中有很多拥有共享实例的类,再以前版本的获取实例是用sharedXXX()函数来获取的,而3.0都只使用一个函数getInstance()来获取。可以看下面的说明: /** @deprecated Use getInstance() instead */CC_DEPRECATED_ATTRIBUTE static FileUtils* sharedFileUtils() { return getInstance(); }

可以看出虽然现在还可以使用sharedFileUtils(),但他已经被标注为废弃。很显然使用getInstance()更加明了简介。

std::string getStringFromFile(const std::string& filename);//读取文件中的字符串

Data getDataFromFile(const std::string& filename);//获取文件数据

下面看一下Data类

class CC_DLL Data{public:static const Data Null;//构造函数Data();Data(const Data& other);Data(Data&& other);~Data();// 重载符号Data& operator= (const Data& other);Data& operator= (Data&& other);unsigned char* getBytes() const;//获取数据ssize_t getSize() const;//尺寸void copy(unsigned char* bytes, const ssize_t size);//从bytes复制void fastSet(unsigned char* bytes, const ssize_t size);//从bytes快速set,使用后bytes将不能在外部使用void clear();//清除bool isNull() const;//判空private:void move(Data& other);private:unsigned char* _bytes;ssize_t _size;};

unsigned char* getFileDataFromZip(const std::string& zipFilePath, const std::string& filename, ssize_t *size);//读取压缩文件数据(zip格式)

如果读取成功size中会返回文件的大小,,否则返回0。

std::string fullPathForFilename(const std::string &filename);//获取文件的完整路径

如果我们通过setSearchPaths()设置搜索路径("/mnt/sdcard/", "internal_dir/"),然后通过setSearchResolutionsOrder()设置子区分路径("resources-ipadhd/", "resources-ipad/", "resources-iphonehd")。如果搜索文件名为’sprite.png’ 那么会先在文件查找字典中查找key: sprite.png -> value: sprite.pvr.gz,然后搜索文件’sprite.pvr.gz’如下顺序:

/mnt/sdcard/resources-ipadhd/sprite.pvr.gz(if not found, search next)/mnt/sdcard/resources-ipad/sprite.pvr.gz(if not found, search next)/mnt/sdcard/resources-iphonehd/sprite.pvr.gz (if not found, search next)/mnt/sdcard/sprite.pvr.gz(if not found, search next)internal_dir/resources-ipadhd/sprite.pvr.gz(if not found, search next)internal_dir/resources-ipad/sprite.pvr.gz(if not found, search next)internal_dir/resources-iphonehd/sprite.pvr.gz (if not found, search next)internal_dir/sprite.pvr.gz(if not found, return "sprite.png")

如果找到返回完整路径,没找到返回’sprite.png’。

void loadFilenameLookupDictionaryFromFile(const std::string &filename);//从文件导入文件名查找字典

文件为plist格式如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ""><plist version="1.0"><dict><key>filenames</key><dict><key>sounds/click.wav</key><string>sounds/click.caf</string><key>sounds/endgame.wav</key><string>sounds/endgame.caf</string><key>sounds/gem-0.wav</key><string>sounds/gem-0.caf</string></dict><key>metadata</key><dict><key>version</key><integer>1</integer></dict></dict></plist>

key对应string

void setFilenameLookupDictionary(const ValueMap& filenameLookupDict);//从ValueMap中设置文件名查找字典

ValueMap的定义:

typedef std::unordered_map<std::string, Value> ValueMap;std::string fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile);//获取相对应文件的完整路径e.g. filename: hello.png, pszRelativeFile: /User/path1/path2/hello.plist Return: /User/path1/path2/hello.pvr (If there a a key(hello.png)-value(hello.pvr) in FilenameLookup dictionary. )

void setSearchResolutionsOrder(const std::vector<std::string>& searchResolutionsOrder);//设置子搜索区分路径

见fullPathForFilename()。

void addSearchResolutionsOrder(const std::string &order);//增加子搜索路径

const std::vector<std::string>& getSearchResolutionsOrder();//获取子搜索区分路径

void setSearchPaths(const std::vector<std::string>& searchPaths);//设置搜索路径

见fullPathForFilename()。

void addSearchPath(const std::string & path);//增加搜索路径

const std::vector<std::string>& getSearchPaths() const;//获取搜索路径

std::string getWritablePath();//获取一个可写入文件的路径

经过测试在win32平台上,debug版本返回的是程序文件所在的路径,release返回的是“我的文档”路径。

bool isFileExist(const std::string& filePath);//判断文件是否存在

懂得接受失败的人,就是懂得人生真谛的人,

[cocos2dx 3.0 (一)] 对文件读写操作 +FileUtils类

相关文章:

你感兴趣的文章:

标签云: