cocos2dx使用AssetsManagerEx进行热更新

</pre><span style="font-size:18px;">一直一来都是用c++来写游戏,最近学lua主要是因为lua更新比较方便,cocos提供了AssetsManager类可以进行一些资源包的更新,但是不够灵活,AssetsManagerEx 是AssetsManager的增强版本,提供了比AssetsManager更加灵活的更新方式<strong>使用AssetsManagerEx的方法:</strong></span><p><span style="font-size:18px;color:#cc0000;"><strong>添加必要的头文件</strong></span></p><p><span style="font-size:18px;"></span><pre name="code" class="cpp">#include "extensions/cocos-ext.h"
USING_NS_CC_EXT;


创建AssetsManagerEx对象
AssetsManagerEx* HelloWorld::getAssetsManagerEx()
{
	static AssetsManagerEx *amEx = nullptr;
	if (!amEx)
	{
		amEx = AssetsManagerEx::create("project.manifest",m_pathToSaveEx);
		amEx->retain();


		if (amEx->getLocalManifest()->isLoaded())
		{
			log("Fail to update assets, step skipped.");
		}


		auto listener = EventListenerAssetsManagerEx::create(amEx,CC_CALLBACK_1(HelloWorld::onAssetsEvent,this));
		Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 1);
	}
	return amEx;
}

AssetsManagerEx在创建的时候需要传入两个参数: 清单文件 更新目录

清单文件project.manifest

下面一个清单文件的一些具体内容
{
 "packageUrl" : "<a target=_blank href="http://tools.itharbors.com/assets_manager/AMTestScene1/">http://tools.itharbors.com/assets_manager/AMTestScene1/</a>",
 "remoteManifestUrl" : "<a target=_blank href="http://tools.itharbors.com/assets_manager/AMTestScene1/project_dev.manifest">http://tools.itharbors.com/assets_manager/AMTestScene1/project_dev.manifest</a>",
 "remoteVersionUrl" : "<a target=_blank href="http://tools.itharbors.com/assets_manager/AMTestScene1/version_dev.manifest">http://tools.itharbors.com/assets_manager/AMTestScene1/version_dev.manifest</a>",
 "version" : "1.2.0",
 "engineVersion" : "3.x dev",</p><p> "assets" : {
  "Images/assetMgrBackground1.jpg" : {
   "md5" : "....."
  },
  "Images/ball.png" : {
   "md5" : "..."
  },
  "Images/blocks.png" : {
   "md5" : "..."
  },
  "compressed.zip" : {
   "md5" : "...",
   "compressed" : true
  }
 },
    
    "searchPaths" : [
    ]
}
packageUrl是资源下载的地址
remoteManifestUrl是获取远程清单文件的url
remoteVersionUrl是获取远程版本清单文件的url

assets 里面包含的则是文件的清单


另一个是资源的更新目录,下载好的资源就在该目录下

单独创建一个函数来获取更新目录

void HelloWorld::InitDownLoadDirEx()
{
	m_pathToSaveEx = FileUtils::getInstance()->getWritablePath();


#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
	DIR *pDir = NULL;
	pDir = opendir(m_pathToSaveEx.c_str());
	if (!pDir)
	{
		mkdir(m_pathToSaveEx.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
	}
#else
	if ((GetFileAttributesA(m_pathToSaveEx.c_str())) == INVALID_FILE_ATTRIBUTES)
	{
		CreateDirectoryA(m_pathToSaveEx.c_str(), 0);
	}
#endif
	CCLOG("InitDownLoadDirEx end");
}
不同平台的目录创建方式有点不同



处理更新事件
AssetsManagerEx的监听处理比AssetsManager更简单,只需要注册一个监听,上面代码里面已经有了
下面是监听函数的内容


void HelloWorld::onAssetsEvent(EventAssetsManagerEx* pEvent)
{
	switch (pEvent->getEventCode())
	{
	case EventAssetsManagerEx::EventCode::ERROR_NO_LOCAL_MANIFEST:
		{
			log("没有本地清单文件");
		}
		break;
	case EventAssetsManagerEx::EventCode::ERROR_DOWNLOAD_MANIFEST:
		{
			log("下载远程清单文件失败");
		}
		break;
	case EventAssetsManagerEx::EventCode::ERROR_PARSE_MANIFEST:
		{
			log("解析清单文件失败");
		}
		break;
	case EventAssetsManagerEx::EventCode::NEW_VERSION_FOUND:
		{
			log("找到新版本");
		}
		break;
	case EventAssetsManagerEx::EventCode::ALREADY_UP_TO_DATE:
		{
			log("更新完成");
		}
		break;
	case EventAssetsManagerEx::EventCode::UPDATE_PROGRESSION:
		{
			log("更新中");
			char szBuf[256] = "";
			sprintf(szBuf,"%s,%0.2f,%0.2f",pEvent->getAssetId().c_str(),pEvent->getPercentByFile(),pEvent->getPercent());
			m_pProcessLabel->setString(szBuf);
		}
		break;
	case EventAssetsManagerEx::EventCode::ASSET_UPDATED:
		{
			log("检测更新");
		}
		break;
	case EventAssetsManagerEx::EventCode::ERROR_UPDATING:
		{
			log("更新出错");
		}
		break;
	case EventAssetsManagerEx::EventCode::UPDATE_FINISHED:
		{
			log("更新完成");
		}
		break;
	case EventAssetsManagerEx::EventCode::UPDATE_FAILED:
		{
			log("更新失败");
		}
		break;
	case EventAssetsManagerEx::EventCode::ERROR_DECOMPRESS:
		{
			log("解压出错");
		}
		break;
	default:
		break;
	}
}

注意:
pEvent->getPercentByFile()是获取的整个更新进度

pEvent->getPercent()是获取的当前文件的下载进度


启动更新
很简单

InitDownLoadDirEx();
getAssetsManagerEx()->update();


AssetsManagerEx在更新文件的时候首先会访问本地的清单文件,获取其中的remoteManifestUrl和remoteVersionUrl,并且通过它们得到最新的清单文件和版本信息,将远程的清单内容与本地的清单做比较,如果远程的版本号大于本地版本号则比对assets项,将与本地清单不同的文件项都下载下来,然后覆盖本地的清单文件

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值