文档章节

Cocos2d-x 3.2 自动更新 -- 使用AssetsManager更新游戏资源包

piggybear
 piggybear
发布于 2015/02/16 10:28
字数 756
阅读 35
收藏 0

Android和win32已经测试通过,理论上IOS也可以。

1、AssetsManagerDelegateProtocol

AssetsManagerDelegateProtocol,用于与服务器校验版本号,更新下载资源包,并对成功、出错、下载进度等进行回调

2、资源包名称

所下载资源包名称默认为:cocos2dx-update-temp-package.zip。

如果想要修改文件名,直接修改引擎下 extensions\assets-manager\AsetsManager.ccp中的TEMP_PACKAGE_FILE_NAME


3、服务器

下以是我的资源包路径和本版号。

http://shezzer.sinaapp.com/downloadTest/cocos2dx-update-temp-package.zip

http://shezzer.sinaapp.com/downloadTest/version.php

4、实现

[cpp]  view plain copy
  1. //  Upgrade.h  
  2. //<img src="http://img.blog.csdn.net/20140728093037654?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGlhbmdzaGFvemU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />  
  3. //  Created by Sharezer on 14-07-26.  
  4. //  
  5. //  
  6.   
  7. #ifndef _UPGRADE_H_  
  8. #define _UPGRADE_H_  
  9. #include "cocos2d.h"  
  10. #include "extensions/cocos-ext.h"  
  11.   
  12. class Upgrade : public cocos2d::CCLayer, public cocos2d::extension::AssetsManagerDelegateProtocol  
  13. {  
  14. public:  
  15.     Upgrade();  
  16.     virtual ~Upgrade();  
  17.   
  18.     virtual bool init();  
  19.   
  20.     void upgrade(cocos2d::Ref* pSender);    //检查版本更新  
  21.     void reset(cocos2d::Ref* pSender);      //重置版本  
  22.   
  23.     virtual void onError(cocos2d::extension::AssetsManager::ErrorCode errorCode);       //错误信息  
  24.     virtual void onProgress(int percent);   //更新下载进度  
  25.     virtual void onSuccess();       //下载成功  
  26.     CREATE_FUNC(Upgrade);  
  27. private:  
  28.     cocos2d::extension::AssetsManager* getAssetManager();  
  29.     void initDownloadDir();     //创建下载目录  
  30.   
  31. private:  
  32.     std::string _pathToSave;  
  33.     cocos2d::Label *_showDownloadInfo;  
  34. };  
  35.   
  36.   
  37. #endif  

[cpp]  view plain copy
  1. //Upgrade.cpp  
[cpp]  view plain copy
  1. #include "Upgrade.h"  
  2. #include "HelloWorldScene.h"  
  3.   
  4. #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)  
  5. #include <dirent.h>  
  6. #include <sys/stat.h>  
  7. #endif  
  8.   
  9. USING_NS_CC;  
  10. USING_NS_CC_EXT;  
  11.   
  12. #define DOWNLOAD_FIEL       "download"  //下载后保存的文件夹名  
  13.   
  14. Upgrade::Upgrade():  
  15. _pathToSave(""),  
  16. _showDownloadInfo(NULL)  
  17. {  
  18.   
  19. }  
  20.   
  21. Upgrade::~Upgrade()  
  22. {  
  23.     AssetsManager* assetManager = getAssetManager();  
  24.     CC_SAFE_DELETE(assetManager);  
  25. }  
  26.   
  27. bool Upgrade::init()  
  28. {  
  29.     if (!CCLayer::init())  
  30.     {  
  31.         return false;  
  32.     }  
  33.     Size winSize = Director::getInstance()->getWinSize();  
  34.     initDownloadDir();  
  35.     _showDownloadInfo = Label::createWithSystemFont("""Arial", 20);  
  36.     this->addChild(_showDownloadInfo);  
  37.     _showDownloadInfo->setPosition(Vec2(winSize.width / 2, winSize.height / 2 - 20));  
  38.   
  39.   
  40.     auto itemLabel1 = MenuItemLabel::create(  
  41.         Label::createWithSystemFont("Reset""Arail", 20), CC_CALLBACK_1(Upgrade::reset, this));  
  42.     auto itemLabel2 = MenuItemLabel::create(  
  43.         Label::createWithSystemFont("Upgrad""Arail", 20), CC_CALLBACK_1(Upgrade::upgrade, this));  
  44.   
  45.     auto menu = Menu::create(itemLabel1, itemLabel2, NULL);  
  46.     this->addChild(menu);  
  47.   
  48.     itemLabel1->setPosition(Vec2(winSize.width / 2, winSize.height / 2 + 20));  
  49.     itemLabel2->setPosition(Vec2(winSize.width / 2, winSize.height / 2 ));  
  50.   
  51.     menu->setPosition(Vec2::ZERO);  
  52.   
  53.     return true;  
  54. }  
  55.   
  56. void Upgrade::onError(AssetsManager::ErrorCode errorCode)  
  57. {  
  58.     if (errorCode == AssetsManager::ErrorCode::NO_NEW_VERSION)  
  59.     {  
  60.         _showDownloadInfo->setString("no new version");  
  61.     }  
  62.     else if (errorCode == AssetsManager::ErrorCode::NETWORK)  
  63.     {  
  64.         _showDownloadInfo->setString("network error");  
  65.     }  
  66.     else if (errorCode == AssetsManager::ErrorCode::CREATE_FILE)  
  67.     {  
  68.         _showDownloadInfo->setString("create file error");  
  69.     }  
  70. }  
  71.   
  72. void Upgrade::onProgress(int percent)  
  73. {  
  74.     if (percent < 0)  
  75.         return;  
  76.     char progress[20];  
  77.     snprintf(progress, 20, "download %d%%", percent);  
  78.     _showDownloadInfo->setString(progress);  
  79. }  
  80.   
  81. void Upgrade::onSuccess()  
  82. {  
  83.     CCLOG("download success");  
  84.     _showDownloadInfo->setString("download success");  
  85.     std::string path = FileUtils::getInstance()->getWritablePath() + DOWNLOAD_FIEL;  
  86.     //FileUtils::getInstance()->addSearchPath(path, true);  
  87.     auto scene = HelloWorld::scene();  
  88.     Director::getInstance()->replaceScene(scene);  
  89. }  
  90.   
  91. AssetsManager* Upgrade::getAssetManager()  
  92. {  
  93.     static AssetsManager *assetManager = NULL;  
  94.     if (!assetManager)  
  95.     {  
  96.         assetManager = new AssetsManager("http://shezzer.sinaapp.com/downloadTest/cocos2dx-update-temp-package.zip",  
  97.             "http://shezzer.sinaapp.com/downloadTest/version.php",  
  98.             _pathToSave.c_str());  
  99.         assetManager->setDelegate(this);  
  100.         assetManager->setConnectionTimeout(3);  
  101.     }  
  102.     return assetManager;  
  103. }  
  104.   
  105. void Upgrade::initDownloadDir()  
  106. {  
  107.     CCLOG("initDownloadDir");  
  108.     _pathToSave = CCFileUtils::getInstance()->getWritablePath();  
  109.     _pathToSave += DOWNLOAD_FIEL;  
  110. CCLOG("Path: %s", _pathToSave.c_str());  
  111. #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)  
  112.     DIR *pDir = NULL;  
  113.     pDir = opendir(_pathToSave.c_str());  
  114.     if (!pDir)  
  115.     {  
  116.         mkdir(_pathToSave.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);  
  117.     }  
  118. #else  
  119.     if ((GetFileAttributesA(_pathToSave.c_str())) == INVALID_FILE_ATTRIBUTES)  
  120.     {  
  121.         CreateDirectoryA(_pathToSave.c_str(), 0);  
  122.     }  
  123. #endif  
  124.     CCLOG("initDownloadDir end");  
  125. }  
  126.   
  127. void Upgrade::reset(Ref* pSender)  
  128. {  
  129.     _showDownloadInfo->setString("");  
  130.     // Remove downloaded files  
  131. #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)  
  132.     string command = "rm -r ";  
  133.     // Path may include space.  
  134.     command += "\"" + _pathToSave + "\"";  
  135.     system(command.c_str());  
  136. #else  
  137.     std::string command = "rd /s /q ";  
  138.     // Path may include space.  
  139.     command += "\"" + _pathToSave + "\"";  
  140.     system(command.c_str());  
  141. #endif  
  142.     getAssetManager()->deleteVersion();  
  143.     initDownloadDir();  
  144. }  
  145.   
  146. void Upgrade::upgrade(Ref* pSender)  
  147. {  
  148.     _showDownloadInfo->setString("");  
  149.     getAssetManager()->update();  
  150.   
  151. }  

运行:


Reset:重置版本号,办删除下载资源。

Upgrad:校验版本号,当有更新时下载新资源。


_pathToSave保存着文件的下载路径,压缩包下载下来后,将被自动解压到_pathToSave中。

以win32为,在cocos2d-x\build\Debug.win32\  中,可以看到我们之前设置的下载目录download。

onSuccess中,当下载成功后,将跳转到HelloWorld。

这时可以在HelloWorld中直接使用已下载的资源。


具体实现代码见下载地址:点击打开链接

转自:http://blog.csdn.net/liangshaoze/article/details/38224013

本文转载自:http://blog.csdn.net/aa294194253/article/details/38685359

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
cocos2d-x学习笔记(七)利用curl获取资源包的大小

cocos2d-x将curl作为第三方库加进来,所以我们可以很方便的使用它。 最近在研究资源热更新,由于想在用户更新之前提示资源包大小,让用户知道此次更新所需消耗流量,所以在资源热更新AssetsM...

wty530
2016/09/13
0
0
Cocos2d-JS 3.2 发布,开源 2D 游戏框架

Cocos2d-JS 3.2 发布了,该版本值得关注的改进内容包括: 分离渲染逻辑重构 Web 引擎,目前已经完成架构级别的重构,带来非常好的性能提升,特别是在移动浏览器上 重构 Web 引擎的分辨率适配...

oschina
2014/12/31
3K
8
白鹭引擎 5.1.2 发布 完善对微信小游戏支持

新年伊始,白鹭科技于1月2日正式发布白鹭引擎(Egret Engine)5.1.2,本次版本是针对在17年12月份发布的白鹭引擎5.1.1版本的一次功能迭代。更新后白鹭引擎完善了对微信小游戏支持,并引入了 ...

白鹭科技
01/08
2.4K
7
白鹭引擎 5.2.7 新增自动合图插件、二进制和声音缓存方案功能

2018年8月13日,白鹭引擎发布5.2.7 版本。本次版本主要新增了两大功能:命令行增加自动合图插件TextureMergerPlugin,微信小游戏支持库增加二进制和声音缓存方案。 同时,本次版本还是对 5....

白鹭科技
08/13
0
0
Quick-cocos2d-x 在线更新

本文借鉴阳光七月的在线更新机制 1、加密: 调用quick框架里面bin/compile_scripts生成game.zip (脚本加密) compilescripts -i scripts -o game.zip -e xxteazip -ek MYKEY -es XT 然后新建一...

小房小田
2014/04/03
0
2

没有更多内容

加载失败,请刷新页面

加载更多

5whys分析法在美团工程师中的实践

前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故不可避免的发生,这些大大小小的事故对公司难免会造成一些负面的影响,为了避免同类...

Skqing
23分钟前
1
0
Android 接收监听开机完成,并且开机自启动

1,定义一个广播接收者的类 ,并重写抽象方法 public class BootCompleteReceiver extends BroadcastReceiver 2,在Androidmanifest 注册 <receiver android:name=".receiver.BootCompleteRece......

lanyu96
26分钟前
2
0
小程序记录

1、button的边框、角等需要在伪元素after修改去除

originDu
29分钟前
1
0
微博什么技术啊……还说支持八个明星并发出轨,结果…

是的,大家可能都知道了,女神张靓颖结婚了。。 我去,写错了,是————赵丽颖。 为什么我头脑一瞬间出现的是张靓颖,作为一个码农,技术宅,拼音缩小都是 ZLY,博主我真有点傻傻分不清楚了...

Java技术栈
29分钟前
10
0
模块化

1,什么是模块化? 模块化是指将一个复杂的系统分解为多个模块,方便编码。 2,为什么要用模块化? 降低复杂性,降低代码耦合度,部署方便,提高效率。 3,模块化的好处? a,避免命名冲突,减少...

羊皮卷
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部