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...學習了大神的代碼~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM