Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2dx 3.3 AssetsManager测试更新大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

创建工程

cmd--进入tools/cocos2d-console/bin(cocos.py所在的目录)--python cocos.py new update –p com.test.update -l cpp -d updateTest
命令中出现的各参数:
update:工程名
com.test.update:android包名
cpp:c++工程
updateTest:工程所在目录


修改代码

HelloWorldScene.h添加:
#include "cocos-ext.h"

在class HelloWorld : public cocos2d::Layer中添加:
	bool initupdate();
	void menuupdateCallBACk(Ref* sender);
	void updateEnd();


	void onError(int nerrCodE);
	void onProgress(int nProgress);
	void onsuccess();


private:
	cocos2d::LabelTTF *m_labelupdate;
	cocos2d::extension::Assetsmanager *m_pAssetsMgr;



HelloWorldScene.cpp添加:
bool HelloWorld::initupdate()
{
	auto visibleSize = Director::geTinstance()->getVisibleSize();
	auto origin = Director::geTinstance()->getVisibLeorigin();


	auto updateItem = MenuItemImage::create(
		"CloseNormal.png","CloseSELEcted.png",CC_CALLBACK_1(HelloWorld::menuupdateCallBACk,this));


	updateItem->setPosition(origin + Vec2(visibleSize / 2));


	// create menu,it's an autorelease object
	auto menu = Menu::create(updateItem,nullptr);
	menu->setPosition(Vec2::ZERO);
	this->addChild(menu,2);


	m_labelupdate = LabelTTF::create("Ready","Arial",30);


	// position the label on the center of the screen
	m_labelupdate->setPosition(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2 + m_labelupdate->getContentSize().height);


	// add the label as a child to this layer
	this->addChild(m_labelupdate,2);


	return true;
}


void HelloWorld::menuupdateCallBACk(Ref* sender)
{
	m_labelupdate->setString("updating...");


	std::string packageUrl = "http://xz.cr173.com/soft1/VA_X_Setup.zip";
	std::string versionFileUrl = "http://xz.cr173.com/soft1/VA_X_Setup.zip";	// 版本在Assetsmanager内部写死,测试用
	// 需要自己处理完整路径,所以直接获取一个可写路径  内部不会判断文件夹是否存在,所以需要确认文件夹存在
	std::string storegePath = FileUtils::geTinstance()->getWritablePath();
	// create create之后是autorelease的,所以需要retain
	m_pAssetsMgr = extension::Assetsmanager::create(
		packageUrl.c_str(),versionFileUrl.c_str(),storegePath.c_str(),CC_CALLBACK_1(HelloWorld::onError,this),CC_CALLBACK_1(HelloWorld::onProgress,CC_CALLBACK_0(HelloWorld::onsuccess,this));
	m_pAssetsMgr->retain();	// retain
	// check
	if (m_pAssetsMgr->checkupdate())
	{
		// update
		m_pAssetsMgr->update();
	}
}


void HelloWorld::updateEnd()
{
	m_pAssetsMgr->release();
}


void HelloWorld::onError(int nerrCodE)
{
	char sTemp[256] = { 0 };
	snprintf(sTemp,256,"update Error! ErrCode:%d",nErrCodE);


	extension::Assetsmanager::ErrorCode errCode = (extension::Assetsmanager::ErrorCodE)nErrCode;
	switch (errCodE)
	{
	case extension::Assetsmanager::ErrorCode::NETWORK:
		snprintf(sTemp,"update Error! NETWORK");
		break;
	case extension::Assetsmanager::ErrorCode::CREATE_FILE:
		snprintf(sTemp,"update Error! CREATE_FILE");
		break;
	case extension::Assetsmanager::ErrorCode::NO_NEW_VERSION:
		snprintf(sTemp,"update Error! NO_NEW_VERSION");
		break;
	case extension::Assetsmanager::ErrorCode::UNCOMPRESS:
		snprintf(sTemp,"update Error! UNCOMPRESS");
		break;
	default:
		break;
	}


	std::string label = sTemp;
	m_labelupdate->setString(label);
	updateEnd();
}


void HelloWorld::onProgress(int nProgress)
{
	char sTemp[256] = { 0 };
	snprintf(sTemp,"Progress:%d",nProgress);
	std::string label = sTemp;
	m_labelupdate->setString(label);
}


void HelloWorld::onsuccess()
{
	m_labelupdate->setString("update Succeed!");
	updateEnd();
}


在bool HelloWorld::init()的return之前,调用:
initupdate();


Assetsmanager.cpp修改:
bool Assetsmanager::checkupdate()内, _version = "1.0.1";写死,做测试用


编译

VS2013编译,修改工程属性,工程--属性--通用配置--C++--常规--附加包含目录
在最前面添加1个包含目录:
$(ENGIneRoot);
否则会出现找不到头文件的错误


android编译,设置NDK_ROOT, 使用r9d及以上版本的NDK,因为需要使用toolchains/arm-linux-androideabi-4.8及以上版本来编译
设置完毕后,直接cmd--cd到工程的build_native.py所在目录--python build_native.py


测试结果

一切流程正常,可以完成完整的更新流程。
更新后的文件会在对应的私有目录下,由于目录路径已经加入到搜索路径,所以可以搜索到更新的文件。
由于添加搜索路径的时候,是将更新文件的路径添加到最前的,所以搜索时,会优先搜索更新的文件,也就是,同名情况下,更新的文件会被优先载入,而之前的文件不会有任何改动,但是不会被载入。
void Assetsmanager::setSearchPath()
{
    vector<String> searchPaths = FileUtils::geTinstance()->getSearchPaths();
    vector<String>::iterator iter = searchPaths.begin();
    searchPaths.insert(iter,_storagePath);	// 将更新的路径添加到搜索路径的最前面,保证先搜索到更新的文件
    FileUtils::geTinstance()->setSearchPaths(searchPaths);
}


@H_450_64@

http://www.cnblogs.com/hll2008/p/4227277.html@H_450_64@


@H_450_64@

一个老版本的cocos2dx可能存在的bug

我们在用Assetsmanager做资源更新的时候遇到了一个问题,部分玩家热更新失败。查了好久才查出来,原来是我们的资源文件被宽带提供商(我们发现BUG的是华数网通、部分手机3G)缓存了这个资源文件,并对我们的请求链接做了跳转。解决办法在Assetsmanager源代码中curl的设置加上一句


@H_450_64@

curl_easy_setopt(_curl,CURLOPT_FOLLOWLOCATION,1); //设置成更随跳转


@H_450_64@

这个问题在3.3版本已经解决。@H_450_64@

http://www.cocoachina.com/bbs/read.php?tid=233044@H_450_64@

大佬总结

以上是大佬教程为你收集整理的cocos2dx 3.3 AssetsManager测试更新全部内容,希望文章能够帮你解决cocos2dx 3.3 AssetsManager测试更新所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。