cocos2dx lua 热更新方案的实现

(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

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

时间: 2024-08-11 07:49:14

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

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

PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5%88%86%E4%BA%ABPPT.pptx 一 .热更新(热修复)产品背景 这里谈到的热更新都是指APP(不包含网页).APP按大类别可以粗略分为 应用 和 游戏.APP的开发周期是极其快速的,在实际开发流程中,我们总会有一些需求迫使我们短时间内快速上线,比如需求流程出错,程序员主观导致的一些bu

我使用的 unity 热更新方案 JSB(求小编 推荐一下)

今天周五 ,明天没有什么事情,可以安心写一些博客. 今天聊 两个话题 一 , unity热更新的窘境 二 ,我所使用的unity 热更新方案JSB ======================================热更新的窘境============================================= (1)其实unity 热更新到瓶颈是 ios 的 系统本身 ,禁止你 jit .说白了,内存中代码,系统本身不让你执行. 安卓 系统,桌面 系统,本身都支持 动态直接替换d

Unity官方公布热更新方案性能对比

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  如何在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对比 什么是热更新 ? 广义定义 ? 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即

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

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  怎样在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 ? 广义定义 ? 无需关闭server,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码又一次打包提交至AppStore,就可以更新clien

unity3d的资源管理和热更新方案

之前开发一直使用cocos2dx,最近开始搭建unity3d的框架,遇到的一个大问题就是热更新.虽然代码采用了slua脚本,unity3d官方也提供了assetbundle这样的解决方案,但是还是有好多的问题需要解决. 1.复杂的资源引用方案.cococ2dx的更新方案很简单--添加附加searchpath,这样只要设置更新文件所在的路径,就能保证优先使用最新资源.但是unity3d并不是这样,因为它没有cocos2dx的FileUtils,没办法控制所有资源的加载.unity3d的资源来源有这

Unity3D热更新方案网摘总结

参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/details/50853207 "热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技术,我们姑且这么叫它,相信很长时间内,大家依然还会这么叫,甚至有人叫它"暖更新". 一.什么是热更新? 广义定义 无需关闭服务器,不停机状态下修复漏

Unity热更新方案(uLua vs sLua)

首先附上这两个项目的地址,这两个项目都是比较完善的lua解决方案,从效率和使用方式上说都不相伯仲,我最终选择了ulua,但是并不是说其具有压倒性优势. uLua:http://ulua.org/index.html sLua:https://github.com/pangweiwei/slua 引入lua,基本上就是为了热更新,不过后面苹果似乎对lua脚本的热更新也限制的很严格,拿脚本做热更新也要偷偷摸摸的去做.所以说我一贯的观点是游戏框架设计的合理些(比如技能.界面中可以用配置的,尽量不要硬编

LUA --热更新

--什么是热更新? 游戏客户端启动时,主动请求服务端检查版本号,并更新资源到本地. 应用场景: 情况一:游戏客户端已经发布了,但突然发现有个比较严重的bug需要修复.这时需要更新游戏的代码(Lua代码). 情况二:情人节到了,需要搞个活动,在游戏中营造一个节日氛围.这时,需要更新游戏资源或增加一些功能. 好处:不需要重新打包和提交应用到市场等待审核. -- 热更新流程-->游戏启动-->检查版本 -->有版本更新-->初始化下载路径 -->设置搜索目录路径(优先搜索下载目录资

cocos2dx lua 热加载实现

[Q]原创 2015-08-30 在公司使用cocos2dx+lua 开发游戏有一段时间了,刚好lua的热更新交给我负责.以前热更新的lua脚本大部分都是在下载之后加载.最近策划又有新需求,需要在游戏过程进行如果有热更新需要提醒用户,也意味着在内存里的lua文件可能不是最新的.后来查到http://www.2cto.com/kf/201411/351833.html此博客发现lua原来加载到了一个package.loaded的缓存中,只要相应的将此设为空并require即可. 后来也就按照该博客