cocos2dx-2.x CCFileUtils文件管理分析(2)

cocos2dx-2.x CCFileUtils文件管理分析(2)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

于1于,我只是对整体结构进行了分析,然后,2于,我会在一些我们经常使用的分析功能。

//获取给定文件名称的全路径 //以下这非常长一段凝视。通过举样例,像我们说明cocos2dx获取文件全路径的规则。 //这段我就不翻译了,直接通过代码来看。 /** Returns the fullpath for a given filename. First it will try to get a new filename from the "filenameLookup" dictionary. If a new filename can't be found on the dictionary, it will use the original filename. Then it will try to obtain the full path of the filename using the CCFileUtils search rules: resolutions, and search paths. The file search is based on the array element order of search paths and resolution directories. For instance: We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") to resolutions vector by setSearchResolutionsOrder. The "internal_dir" is relative to "Resources/". If we have a file named 'sprite.png', the mapping in fileLookup dictionary contains `key: sprite.png -> value: sprite.pvr.gz`. Firstly, it will replace 'sprite.png' with 'sprite.pvr.gz', then searching the file sprite.pvr.gz as follows: /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") If the filename contains relative path like "gamescene/uilayer/sprite.png", and the mapping in fileLookup dictionary contains `key: gamescene/uilayer/sprite.png -> value: gamescene/uilayer/sprite.pvr.gz`. The file search order will be: /mnt/sdcard/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/sprite.pvr.gz (if not found, return "gamescene/uilayer/sprite.png") If the new file can't be found on the file system, it will return the parameter pszFileName directly. @since v2.1 */ virtual std::string fullPathForFilename(const char* pszFileName); -->> std::string CCFileUtils::fullPathForFilename(const char* pszFileName){ CCAssert(pszFileName != NULL, "CCFileUtils: Invalid path"); //推断是否是绝对路径,假设是绝对路径就直接返回。 /* //android下 推断根据就是是否以'/'开头或者以assets/开头。

以下这个函数。凝视的非常清楚。 //你能够做个实验: //例: Get data from file(/second_bg.png) failed! 我在创建精灵时传递/second_bg.png路径 bool CCFileUtilsAndroid::isAbsolutePath(const std::string& strPath) { // On Android, there are two situations for full path. // 1) Files in APK, e.g. assets/path/path/file.png // 2) Files not in APK, e.g. /data/data/org.cocos2dx.hellocpp/cache/path/path/file.png, or /sdcard/path/path/file.png. // So these two situations need to be checked on Android. if (strPath[0] == '/' || strPath.find(m_strDefaultResRootPath) == 0) { return true; } return false; } */ std::string strFileName = pszFileName; if (isAbsolutePath(pszFileName)) { //CCLOG("Return absolute path( %s ) directly.", pszFileName); return pszFileName; } // Already Cached ? //是否已经缓存。假设缓存过,直接返回 std::map<std::string, std::string>::iterator cacheIter = m_fullPathCache.find(pszFileName); if (cacheIter != m_fullPathCache.end()) { //CCLOG("Return full path from cache: %s", cacheIter->second.c_str()); return cacheIter->second; } /* std::string CCFileUtils::getNewFilename(const char* pszFileName) { const char* pszNewFileName = NULL; // in Lookup Filename dictionary ?

//能够把这个m_pFilenameLookupDict(默觉得NULL)字典理解为一种查找 //比方这个字典里存了一个"fish.png(key)" --> "big_fish.png(value)" //那么我们传入fish.png是,就会给我们转化为big_fish.png。

假设没有,则返回我们传入的。

CCString* fileNameFound = m_pFilenameLookupDict ?

(CCString*)m_pFilenameLookupDict->objectForKey(pszFileName) : NULL; if( NULL == fileNameFound || fileNameFound->length() == 0) { pszNewFileName = pszFileName; } else { pszNewFileName = fileNameFound->getCString(); //CCLOG("FOUND NEW FILE NAME: %s.", pszNewFileName); } return pszNewFileName; } */ // Get the new file name. std::string newFilename = getNewFilename(pszFileName); string fullpath = ""; //以下这一段非常关键: //m_searchPathArray 前面介绍过搜索路径数组,须要我们手动设置。

android的初始话会加入一个默认值为 //m_searchPathArray.push_back(m_strDefaultResRootPath)即,"assets/"。 /* m_searchResolutionsOrderArray 能够理解为分辨率搜索顺序,就按开头凝视说明的那样 //m_searchPathArray We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, //m_searchResolutionsOrderArray and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") to resolutions vector by setSearchResolutionsOrder. //组合后的路径 /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) 总结:从这里能够看出,m_searchPathArray在前面的路径,会优先搜索。m_searchResolutionsOrderArray也一样。 */ for (std::vector<std::string>::iterator searchPathsIter = m_searchPathArray.begin(); searchPathsIter != m_searchPathArray.end(); ++searchPathsIter) { for (std::vector<std::string>::iterator resOrderIter = m_searchResolutionsOrderArray.begin(); resOrderIter != m_searchResolutionsOrderArray.end(); ++resOrderIter) { //CCLOG("\n\nSEARCHING: %s, %s, %s", newFilename.c_str(), resOrderIter->c_str(), searchPathsIter->c_str()); //以下我分析一下这个函数:-->> 2 fullpath = this->getPathForFilename(newFilename, *resOrderIter, *searchPathsIter); //这里会对找到的路径,进行缓存 if (fullpath.length() > 0) { // Using the filename passed in as key. m_fullPathCache.insert(std::pair<std::string, std::string>(pszFileName, fullpath)); //CCLOG("Returning path: %s", fullpath.c_str()); return fullpath; } } } //CCLOG("cocos2d: fullPathForFilename: No file found at %s. Possible missing file.", pszFileName); // The file wasn't found, return the file name passed in. return pszFileName;}--> 2//filename -- 传入的文件名称//searchPath -- 搜索路径//resolutionDirectory -- 资源分辨率路径std::string CCFileUtils::getPathForFilename(const std::string& filename, const std::string& resolutionDirectory, const std::string& searchPath){ std::string file = filename; std::string file_path = ""; size_t pos = filename.find_last_of("/"); if (pos != std::string::npos) { file_path = filename.substr(0, pos+1); file = filename.substr(pos+1); } //假设传入的"gamescene/uilayer/sprite.png"是这种路径。那么进行一定的处理, //处理成:path = searchPath + gamescene/uilayer/ + resourceDirectory file = sprite.png ///mnt/sdcard/ gamescene/uilayer/ resources-ipadhd/sprite.pvr.gz // searchPath + file_path + resourceDirectory std::string path = searchPath; path += file_path; path += resolutionDirectory; path = getFullPathForDirectoryAndFilename(path, file); //CCLOG("getPathForFilename, fullPath = %s", path.c_str()); return path;}-->>std::string CCFileUtils::getFullPathForDirectoryAndFilename(const std::string& strDirectory, const std::string& strFilename){ std::string ret = strDirectory+strFilename; //假设文件存在。就把文件的路径返回,这个路径可能是绝对路径,也可能是包里的路径 if (!isFileExist(ret)) { ret = ""; } return ret;}-->>//把上面合成的整个文件路径传进去,推断文件是否存在bool CCFileUtilsAndroid::isFileExist(const std::string& strFilePath){ if (0 == strFilePath.length()) { return false; } bool bFound = false; // Check whether file exists in apk. //假设不是以'/'开头,就在android包里查找 if (strFilePath[0] != '/') { //假设不是以"assets/"开头,则插入 std::string strPath = strFilePath; if (strPath.find(m_strDefaultResRootPath) != 0) {// Didn't find "assets/" at the beginning of the path, adding it. strPath.insert(0, m_strDefaultResRootPath); } //在安装包里查找,看是否存在 if (s_pZipFile->fileExists(strPath)) { bFound = true; } } else { //假设是绝对路径,看否打开成功。假设成功,则证明文件存在。

FILE *fp = fopen(strFilePath.c_str(), "r"); if(fp) { bFound = true; fclose(fp); } } return bFound;}总结:这里须要知道一点。就是先载入搜索路径的路径,会优先搜索。 例如热更新,我们只是想更新的路径在你面前的设置就可以。

版权声明:原创文章,转载请注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116935.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库课程设计-职工工资管理系统

    数据库课程设计-职工工资管理系统XXX大学《数据库原理及应用课程设计》设计报告…

    2022年5月18日
  • 梯度下降 随机梯度下降 算法是_神经网络算法

    梯度下降 随机梯度下降 算法是_神经网络算法一、一维梯度下降算法思想:我们要找到一个函数的谷底,可以通过不断求导,不断逼近,找到一个函数求导后为0,我们就引入了一个概念学习率(也可以叫作步长),因为是不断逼近某个x,所以学习率过大会导致超过最优解,而学习率过小,会导致收敛速度过慢。二、多维梯度下降算法思想:和一维梯度下降算法思想类似,只是导数由原来的一维变成现在的多维,算法思想本质没有变化,在计算导数的过程发生了…

    2022年9月3日
  • Java 图片 滑动 解锁「建议收藏」

    Java 图片 滑动 解锁「建议收藏」滑动解锁功能大家都不陌生,类似于如下这种:公司近期也要求实现类似的功能,百度各种文章,总算实现了一个比较糙的版本,保密等原因就不贴完成图了。我觉得难点在于滑块图和背景图的处理。图片处理原理我粗略的理解,图片就是一个二维的直角坐标系的一部分,(x,y)就是对应位置的一个像素点,可以操作某一个像素点,比如改变颜色,设置透明度等。Java中使用BufferedImage完成图…

    2022年6月18日
  • 工程机械核心部件寿命预测前三名方案总结与2022年最新方案分享(万文详解)[通俗易懂]

    工程机械核心部件寿命预测前三名方案总结与2022年最新方案分享(万文详解)[通俗易懂]1.比赛学习方法论2.工业寿命预测赛题讲解2.1赛题背景2.2赛题任务和数据介绍2.3评测标准2.4初赛与复赛排行榜2.5数据分析2.6数据预处理2.7特征提取3.前三名数据预处理方法比较4.前三名特征工程方法比较4.1特征构建4.2特征选择5.前三名模型构建比较6.代码与数据7.2022年最新思路分享………

    2022年8月31日
  • 程序员必备的 4 款录屏工具,免费无广告!

    程序员必备的 4 款录屏工具,免费无广告!公众号关注“GitHubDaily”设为“星标”,每天带你逛GitHub!大家好,我是小G。今天给大家介绍四款在电脑端超级好用录屏软件,学习和工作、录游戏的时候再也不愁找不到好用…

    2022年6月21日
  • mac电脑卸载软件_docker卸载镜像

    mac电脑卸载软件_docker卸载镜像  在Mac上卸载docker,首先要关闭docker软件,然后进入/usr/local/bin/目录,依次使用如下命令:##1)进入docker的安装目录cd/usr/local/bin/##2)删除与docker相关的文件夹sudorm-rfdocker*sudorm-rfcom.docker.*sudorm-rfhub-tool*sudorm-rfkube*sudorm-rfvpnkit*  如图(1)所示:图(1)完成删除

    2022年8月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号