注册 登录
  • 欢迎访问Sharezer Blog

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

Cocos sharezer 1261次浏览 已收录 0个评论

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

1、AssetsManagerDelegateProtocol

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

2、资源包名称

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

如果想要修改文件名,直接修改引擎下 extensionsassets-managerAsetsManager.ccp中的TEMP_PACKAGE_FILE_NAME

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

3、服务器

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

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

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

4、实现

//  Upgrade.h
//<img src="http://img.blog.csdn.net/20140728093037654?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGlhbmdzaGFvemU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
//  Created by Sharezer on 14-07-26.
//
//

#ifndef _UPGRADE_H_
#define _UPGRADE_H_
#include "cocos2d.h"
#include "extensions/cocos-ext.h"

class Upgrade : public cocos2d::CCLayer, public cocos2d::extension::AssetsManagerDelegateProtocol
{
public:
    Upgrade();
    virtual ~Upgrade();

    virtual bool init();

    void upgrade(cocos2d::Ref* pSender);    //检查版本更新
    void reset(cocos2d::Ref* pSender);      //重置版本

    virtual void onError(cocos2d::extension::AssetsManager::ErrorCode errorCode);       //错误信息
    virtual void onProgress(int percent);   //更新下载进度
    virtual void onSuccess();       //下载成功
    CREATE_FUNC(Upgrade);
private:
    cocos2d::extension::AssetsManager* getAssetManager();
    void initDownloadDir();     //创建下载目录

private:
    std::string _pathToSave;
    cocos2d::Label *_showDownloadInfo;
};


#endif
#include "Upgrade.h"
#include "HelloWorldScene.h"

#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#include <dirent.h>
#include <sys/stat.h>
#endif

USING_NS_CC;
USING_NS_CC_EXT;

#define DOWNLOAD_FIEL      "download"  //下载后保存的文件夹名

Upgrade::Upgrade():
_pathToSave(""),
_showDownloadInfo(NULL)
{

}

Upgrade::~Upgrade()
{
    AssetsManager* assetManager = getAssetManager();
    CC_SAFE_DELETE(assetManager);
}

bool Upgrade::init()
{
    if (!CCLayer::init())
    {
        return false;
    }
    Size winSize = Director::getInstance()->getWinSize();
    initDownloadDir();
    _showDownloadInfo = Label::createWithSystemFont("", "Arial", 20);
    this->addChild(_showDownloadInfo);
    _showDownloadInfo->setPosition(Vec2(winSize.width / 2, winSize.height / 2 - 20));


    auto itemLabel1 = MenuItemLabel::create(
        Label::createWithSystemFont("Reset", "Arail", 20), CC_CALLBACK_1(Upgrade::reset, this));
    auto itemLabel2 = MenuItemLabel::create(
        Label::createWithSystemFont("Upgrad", "Arail", 20), CC_CALLBACK_1(Upgrade::upgrade, this));

    auto menu = Menu::create(itemLabel1, itemLabel2, NULL);
    this->addChild(menu);

    itemLabel1->setPosition(Vec2(winSize.width / 2, winSize.height / 2 + 20));
    itemLabel2->setPosition(Vec2(winSize.width / 2, winSize.height / 2 ));

    menu->setPosition(Vec2::ZERO);

    return true;
}

void Upgrade::onError(AssetsManager::ErrorCode errorCode)
{
    if (errorCode == AssetsManager::ErrorCode::NO_NEW_VERSION)
    {
        _showDownloadInfo->setString("no new version");
    }
    else if (errorCode == AssetsManager::ErrorCode::NETWORK)
    {
        _showDownloadInfo->setString("network error");
    }
    else if (errorCode == AssetsManager::ErrorCode::CREATE_FILE)
    {
        _showDownloadInfo->setString("create file error");
    }
}

void Upgrade::onProgress(int percent)
{
    if (percent < 0)
        return;
    char progress[20];
    snprintf(progress, 20, "download %d%%", percent);
    _showDownloadInfo->setString(progress);
}

void Upgrade::onSuccess()
{
    CCLOG("download success");
    _showDownloadInfo->setString("download success");
    std::string path = FileUtils::getInstance()->getWritablePath() + DOWNLOAD_FIEL;
    //FileUtils::getInstance()->addSearchPath(path, true);
    auto scene = HelloWorld::scene();
    Director::getInstance()->replaceScene(scene);
}

AssetsManager* Upgrade::getAssetManager()
{
    static AssetsManager *assetManager = NULL;
    if (!assetManager)
    {
        assetManager = new AssetsManager("http://shezzer.sinaapp.com/downloadTest/cocos2dx-update-temp-package.zip",
            "http://shezzer.sinaapp.com/downloadTest/version.php",
            _pathToSave.c_str());
        assetManager->setDelegate(this);
        assetManager->setConnectionTimeout(3);
    }
    return assetManager;
}

void Upgrade::initDownloadDir()
{
    CCLOG("initDownloadDir");
    _pathToSave = CCFileUtils::getInstance()->getWritablePath();
    _pathToSave += DOWNLOAD_FIEL;
CCLOG("Path: %s", _pathToSave.c_str());
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
    DIR *pDir = NULL;
    pDir = opendir(_pathToSave.c_str());
    if (!pDir)
    {
        mkdir(_pathToSave.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
    }
#else
    if ((GetFileAttributesA(_pathToSave.c_str())) == INVALID_FILE_ATTRIBUTES)
    {
        CreateDirectoryA(_pathToSave.c_str(), 0);
    }
#endif
    CCLOG("initDownloadDir end");
}

void Upgrade::reset(Ref* pSender)
{
    _showDownloadInfo->setString("");
    // Remove downloaded files
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
    string command = "rm -r ";
    // Path may include space.
    command += """ + _pathToSave + """;
    system(command.c_str());
#else
    std::string command = "rd /s /q ";
    // Path may include space.
    command += """ + _pathToSave + """;
    system(command.c_str());
#endif
    getAssetManager()->deleteVersion();
    initDownloadDir();
}

void Upgrade::upgrade(Ref* pSender)
{
    _showDownloadInfo->setString("");
    getAssetManager()->update();

}

<br />

运行:

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

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

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

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

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

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

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

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

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

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

<br />

Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Cocos2d-x 3.2 自动更新 — 使用AssetsManager更新游戏资源包
喜欢 (2)
[liangshaoze@sina.cn]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址