cocos2dx 3.3 AssetsManager测试更新
发布时间:2020-12-14 16:54:08 所属栏目:百科 来源:网络整理
导读:创建工程 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:工程所在目录 修改代
创建工程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); }
参考:http://www.cnblogs.com/hll2008/p/4227277.html
一个老版本的cocos2dx可能存在的bug我们在用AssetsManager做资源更新的时候遇到了一个问题,部分玩家热更新失败。查了好久才查出来,原来是我们的资源文件被宽带提供商(我们发现BUG的是华数网通、部分手机3G)缓存了这个资源文件,并对我们的请求链接做了跳转。解决办法在AssetsManager源代码中curl的设置加上一句 curl_easy_setopt(_curl,CURLOPT_FOLLOWLOCATION,1); //设置成更随跳转
这个问题在3.3版本已经解决。 参考:http://www.cocoachina.com/bbs/read.php?tid=233044 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |