Cocos2dx-3.2 引擎学习(三)之AssetsManager

按理说,是从头梳理cocos2dx,但是最近的需求。开始梳理学习AssetsManager。

AssetsManager 的使用分步骤看:

1.create obj

1 pAssetsManager = new AssetsManager("https://raw.github.com/minggo/AssetsManagerTest/master/package.zip",
2                                            "https://raw.github.com/minggo/AssetsManagerTest/master/version",
3                                            pathToSave.c_str());

三个参数:AssetsManager(资源zip包,资源版本号,下载zip后的保存路径)

2.add Listener

1 pAssetsManager->setDelegate(this);

AssetsManager的三个回调方法:

1     virtual void onError(cocos2d::extension::AssetsManager::ErrorCode errorCode);
2     virtual void onProgress(int percent);
3     virtual void onSuccess();

使用回调的时候,需要让对应的类继承cocos2d::extension::AssetsManagerDelegateProtocol。然后重写上面的三个方法。

AssetsManager源码:===========================

void AssetsManager::setDelegate(AssetsManagerDelegateProtocol *delegate)
{
  _delegate = delegate;
}

=========================================

3.timeout time setting

1 pAssetsManager->setConnectionTimeout(3);

网络连接,超时时间的设置。

4.start update resource.

1 getAssetsManager()->update();

执行update下载的时候分为3步骤:

  4.1 检查三个参数, (zip, versioncode, output dir)

  4.2 检查更新,(判断本地记录的版本跟服务器上面的版本号是否一致,如果版本号相等,则没有发现新版本。)

  4.3 创建线程Thread,下载,解压 ,更新

5.reset or delete version record

1     // Delete recorded version codes.
2     getAssetsManager()->deleteVersion();

如果有需要,可以重置记录在本地的versioncode的userdefault的xml文件

看本地的版本生成文件userdefault.xml:

<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
  <current-version-code>1.1</current-version-code>
  <downloaded-version-code></downloaded-version-code>
</userDefaultRoot>

current-version-code 指的是当前的本地的版本号。

(这样,在应用每次检查更新的时候,就会读取这个版本号,用来跟服务器上的版本号进行比对,如果不一致,就下载

(不存在是否版本号谁大谁小关系(源码就是这样写的)))

downloaded-version-code 在下载zip资源文件成功时,设置此时服务器上面的版本号,

紧接着,解压..........................解压完成后,立刻又将downloaded-version-code设置成空。

所以在程序角度看,这个值永远是空值的。。(除非是已经下载了,但是没有解压。)

这样做的好处是:。。。。我猜想,可能是设计者怕在解压的过程中,程序挂了,解压也没有完成。

这样,downloaded-version-code 就有值了,也就是在服务器上下载的最新zip包的版本(本地也有对应的最新zip包)。

下次当再次启动应用,请求服务器的时候,就不用下载zip包了,而是直接进入解压步骤。

下载完成以后:

 1        // Record new version code.
 2             UserDefault::getInstance()->setStringForKey(this->keyOfVersion().c_str(), this->_version.c_str());
 3             
 4             // Unrecord downloaded version code.
 5             UserDefault::getInstance()->setStringForKey(this->keyOfDownloadedVersion().c_str(), "");
 6             UserDefault::getInstance()->flush();
 7             
 8             // Set resource search path.
 9             this->setSearchPath();
10             
11             // Delete unloaded zip file.
12             string zipfileName = this->_storagePath + TEMP_PACKAGE_FILE_NAME;
13             if (remove(zipfileName.c_str()) != 0)
14             {
15                 CCLOG("can not remove downloaded zip file %s", zipfileName.c_str());
16             }
17             
18             if (this->_delegate) this->_delegate->onSuccess();

上面的代码:记录当前本地的版本号:current-version-code

      删除已经下载的版本号:downloaded-version-code

      设置优先资源路径

      删除下载的zip资源文件

      发送通知消息,表明成功完成了下载解压更新。

整个过程是只下载了一个zip更新。也就是属于一次性的更新。(整个过程只有一个userdefault.xml文件)

考虑如果有多个模块需要更新呢...(~~~~~还是具体情况具体对待~~~~~~)

嗯。over...学习了大神的代码~

原文地址:https://www.cnblogs.com/vokie/p/4021724.html