(Upgrade.h)

#include <stdio.h>

#include "cocos2d.h"

#include "framework/utils/Utils.h"

#include "framework/json/JSONObject.h"

USING_NS_CC;

#include "ide-support/SimpleConfigParser.h"

#include "extensions/cocos-ext.h"

USING_NS_CC_EXT;

using namespace std;

class Upgrade : public Layer, public AssetsManagerDelegateProtocol

{

public:

static Scene* createScene();

Upgrade();

virtual void onEnter();

virtual ~Upgrade();

virtual bool init();

void enterScene();

void upgrade(); //检查版本更新

  //重写AssetsManagerDelegateProtocol中的三个虚函数

virtual void onError(AssetsManager::ErrorCode errorCode); //错误信息

virtual void onProgress(int percent); //更新下载进度

virtual void onSuccess(); //下载成功

CREATE_FUNC(Upgrade);

private:

AssetsManager* getAssetManager();

string DirectoryPathCache_Res;

string DirectoryPathCache_Src;

string DirectoryPathCache_Resources;

};

#include "framework/updater/Upgrade.h"

#include "SimpleAudioEngine.h"

#include "CCLuaEngine.h"

#include "lua_module_register.h"

#include "cocos2d.h"

#if (CC_TARGET_PLATFORM != CC_PLATFORM_LINUX)

#include "ide-support/CodeIDESupport.h"

#endif

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)

#include "runtime/Runtime.h"

#include "ide-support/RuntimeLuaImpl.h"

#endif

(Upgrade.cpp)

USING_NS_CC;

USING_NS_CC_EXT;

using namespace CocosDenshion;

#define TEMP_PACKAGE_FILE_NAME "Scripts" //下载后保存的文件夹名

static const char * UpdaterConfig="res/UpdaterConfig.json";

static const char * KEY_PackageURL="PackageUrl";

static const char * KEY_VersionURL="VersionUrl";

Upgrade::Upgrade()

{

std::vector<std::string> searchPaths;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

FileUtils::getInstance()->setPopupNotify(false);

searchPaths.push_back("ccs-res/");

searchPaths.push_back("ccs-res/res/");

string path= StringUtils::format("%s%s",FileUtils::getInstance()->getWritablePath().c_str(),"debugruntime/");

DirectoryPathCache_Resources=path;

DirectoryPathCache_Res=StringUtils::format("%s/res/",path.c_str());

DirectoryPathCache_Src=StringUtils::format("%s/src/",path.c_str());;

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

DirectoryPathCache_Res=FileUtils::getInstance()->fullPathForFilename("res");

DirectoryPathCache_Resources=StringUtils::format("%s/", DirectoryPathCache_Res.substr(0, DirectoryPathCache_Res.find_last_of("/")).c_str());

DirectoryPathCache_Src=FileUtils::getInstance()->fullPathForFilename("src");

#endif

searchPaths.push_back(DirectoryPathCache_Src);

searchPaths.push_back(DirectoryPathCache_Res);

FileUtils::getInstance()->setSearchPaths(searchPaths);

}

Scene* Upgrade::createScene()

{

auto scene = Scene::create();

auto layer = Upgrade::create();

scene->addChild(layer);

return scene;

}

Upgrade::~Upgrade()

{

AssetsManager* assetManager = getAssetManager();

CC_SAFE_DELETE(assetManager);

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)

// NOTE:Please don't remove this call if you want to debug with Cocos Code IDE

RuntimeEngine::getInstance()->end();

#endif

}

bool Upgrade::init()

{

if (!CCLayer::init())

{

return false;

}

return true;

}

void Upgrade::onError(AssetsManager::ErrorCode errorCode)

{

if (errorCode == AssetsManager::ErrorCode::NO_NEW_VERSION)

{

CCLOG("检查新版本: %s","当前已是最新版本");

}

else if (errorCode == AssetsManager::ErrorCode::NETWORK)

{

CCLOG("检查新版本: %s","更新失败 请检查网络状态");

}

else if (errorCode == AssetsManager::ErrorCode::CREATE_FILE)

{

CCLOG("检查新版本: %s","创建临时文件失败");

}else if(errorCode == AssetsManager::ErrorCode::UNCOMPRESS){

CCLOG("检查新版本: %s","更新包解压失败");

}

}

void Upgrade::onProgress(int percent)

{

if (percent < 0)

return;

CCLOG("下载进度: %d%%",percent);

}

void Upgrade::onEnter(){

CCLOG("onEnter!");

upgrade();

}

void Upgrade::onSuccess()

{

CCLOG("下载完毕!");

this->enterScene();

}

void Upgrade::enterScene(){

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)

RuntimeEngine::getInstance()->addRuntime(RuntimeLuaImpl::create(), kRuntimeEngineLua);

RuntimeEngine::getInstance()->start();

CCLOG("iShow!");

#else

auto engine = LuaEngine::getInstance();

ScriptEngineManager::getInstance()->setScriptEngine(engine);

lua_module_register(engine->getLuaStack()->getLuaState());

engine->getLuaStack()->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));

engine->executeScriptFile("src/main.lua");

#endif

}

static void ConfigAndroidParameters(JSONObject * object){

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JSONObject * json=JSONObject::create();

json->put("NETLOG_URL",object->getString("NETLOG_URL").c_str());

Utils::ConfigParameters(json->toString());

#endif

}

AssetsManager* Upgrade::getAssetManager()

{

static AssetsManager *assetManager = NULL;

if (!assetManager)

{

static AssetsManager *assetManager = NULL;

if (!assetManager)

{

string fileContent = "";

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

string fullPathFile=StringUtils::format("%s%s%s",FileUtils::getInstance()->getWritablePath().c_str(),"debugruntime/",UpdaterConfig);

CCLOG("文件路径:--------%s",fullPathFile.c_str());

fileContent = FileUtils::getInstance()->getStringFromFile(fullPathFile);

#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

string fullPathFile=FileUtils::getInstance()->fullPathForFilename(UpdaterConfig);

fileContent = FileUtils::getInstance()->getStringFromFile(fullPathFile);

CCLOG("文件路径:--------%s",fullPathFile.c_str());

#endif

CCLOG("配置文件内容:%s",fileContent.c_str());

JSONObject * object=JSONObject::create(fileContent.c_str());

ConfigAndroidParameters(object);

//获取更新包地址

string packageUrl=object->getString(KEY_PackageURL);

//获取版本号地址

string versionUrl=object->getString(KEY_VersionURL);

CCLOG("更新包地址:%s",packageUrl.c_str());

CCLOG("获取版本号地址:%s",versionUrl.c_str());

string storageDirectory=DirectoryPathCache_Resources;

CCLOG("下载存储路径:%s",storageDirectory.c_str());

assetManager = new AssetsManager(packageUrl.c_str(),versionUrl.c_str(), storageDirectory.c_str());

assetManager->setDelegate(this);

assetManager->setConnectionTimeout(8);

CCLOG("当前版本号:%s",assetManager->getVersion().c_str());

if (assetManager->checkUpdate()) {

assetManager->update();

}else{

this->enterScene();

}

}

}

return assetManager;

}

void Upgrade::upgrade()

{

getAssetManager();

}

#endif

(作者很懒,此处不做注释,后续修改)

cocos2dx lua 热更新方案的实现的更多相关文章

  1. 腾讯开源手游热更新方案,Unity3D下的Lua编程

    原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...

  2. 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...

  3. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  4. Unity代码热更新方案 JSBinding + SharpKit 首页

    目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到 JavaScript (引擎是 Mo ...

  5. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...

  6. Unity实现c#热更新方案探究(三)

    转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...

  7. Unity3D 热更新方案总结

    如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...

  8. Unity官方发布热更新方案性能对照

    孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对 ...

  9. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

随机推荐

  1. poj 2769 感觉♂良好 (单调栈)

    poj 2769 感觉♂良好 (单调栈) 比尔正在研发一种关于人类情感的新数学理论.他最近致力于研究一个日子的好坏,如何影响人们对某个时期的回忆. 比尔为人的一天赋予了一个正整数值. 比尔称这个值为当 ...

  2. 2014 Noip提高组 Day1

    P1328 生活大爆炸版石头剪刀布 [题目描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头 ...

  3. 剑指Offer的学习笔记(C#篇)-- 连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  4. jquery jtemplates.js模板渲染引擎的详细用法第一篇

    jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...

  5. Linux命令 查看Linux版本和是否联网

    1.查看Linux内核版本 1.1 $ cat /proc/version [heima01@heima01 ~]$ cat /proc/version Linux version 2.6.32-57 ...

  6. ==和equals方法

    Java程序中测试两个变量时否相等有两种方法: == 和 equals. ==判断 当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数字类型(不一定要求数据类型严格相同),则只要 ...

  7. ios Realm的使用 本地数据存储

    引入需要的文件 pod 'RealmSwift' pod 'Realm' 然后在命令行使用 (首先应该cd到项目的根目录)输入 pod install 等待下载就行了(这个下载有点费劲,其他的插件包下 ...

  8. [Leetcode] 002. Add Two Numbers

    https://leetcode.com/problems/add-two-numbers/ public class Solution { public ListNode addTwoNumbers ...

  9. Cent OS 6.5 下 Node.js安装

    打开官网 http://nodejs.org/ 点击那个绿色的INSTALL 按钮下载安装包,然后解压.   基本的环境我原本已经安装完毕,这是需求的环境,来源安装包中的README.md,需要的自行 ...

  10. Spring Boot Admin 监控中心

    Spring Boot Admin 监控中心 Spring Boot Admin用来收集微服务系统的健康状态.会话数量.并发数.服务资源.延迟等度量信息 服务端 建立spring-cloud-admi ...