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

本文介绍如何在Cocos2d-x项目中实现资源的热更新,包括使用AssetsManagerDelegateProtocol与服务器交互验证版本及下载资源包,以及在不同平台(如Android、Win32和iOS)上的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章摘自:http://blog.youkuaiyun.com/liangshaoze/article/details/38224013


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、实现


//  Upgrade.h
//<img src="https://img-blog.youkuaiyun.com/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

//Upgrade.cpp

    #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();  
      
    }  

运行:


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

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


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

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

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

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值