加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 20:00:14 所属栏目:百科 来源:网络整理
导读:文章摘自:http://www.jb51.cc/article/p-aseyqndm-bcu.html Android和win32已经测试通过,理论上IOS也可以。 1、AssetsManagerDelegateProtocol AssetsManagerDelegateProtocol,用于与服务器校验版本号,更新下载资源包,并对 成功、出错、下载进度等进行

文章摘自:http://www.52php.cn/article/p-aseyqndm-bcu.html


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

1、AssetsManagerDelegateProtocol

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

2、资源包名称

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

如果想要修改文件名,直接修改引擎下 extensionsassets-managerAsetsManager.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="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

//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",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-xbuildDebug.win32 中,可以看到我们之前设置的下载目录download。

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

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


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读