Cocos2d-x开发系列 交叉开发模式二 初始化和重启

本文介绍了在Cocos2d-x项目中添加Lua支持的方法,通过LuaSupportFactory单例来管理虚拟机的启动和重启。详细讨论了如何初始化引擎,包括调用lua_module_register函数注册模块和设置代码加密模式。此外,还提到了在热更新场景下,如何实现虚拟机的重启,以便重新加载和执行lua脚本。

LuaSupportFactory 开启和重启虚拟机

在原有Cocos2d-x C++项目上添加了Lua支持了,那么我们怎么使用这些接口呢?我们可以实现一个单例来处理Lua相关的底层接口。

封装一个 LuaSupportFactory对象。
专门来处理Lua虚拟机的启动,接口绑定,参数传递等等。

细节咱们先不管,可以先关注实现思路,要是想要代码,可以直接Q我。

1、 首先我们需要一个引擎初始化的接口

/* 初始化Lua虚拟机 */
void initLuaEngine();
void LuaSupportFactory::initLuaEngine()
{
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine( engine );

//注册引擎Core
lua_State* L = engine->getLuaStack()->getLuaState();
lua_module_register( L );

//设置加密策略
LuaStack* stack = engine->getLuaStack();
stack->setXXTEAKeyAndSign( "2dxLua", strlen( "2dxLua" ), "XXTEA", strlen( "XXTEA" ) );

//获取Lua跟C交互的全局栈表 _G
lua_getfield( L, LUA_GLOBALSINDEX, "_G" ); // 大坑:需要先获取_G,否则在register_all_wwclass时,LuaJIT内部会崩溃。
}

我们使用Cocos提供的Lua相关接口,进行初始化。我这里调用了Cocos API接口注册的lua_module_register函数。另外设置了代码加密模式。这里值得注意的是,这里有个大坑,我们需要在这里获取_G表,否则注册我们自己绑定的类的时候会Crash。

2、重启虚拟机

毋庸置疑,我们既然选择使用lua脚本,那么肯定会选择使用热更,所以我们需要提供一个reset package的函数,也可以理解为重启虚拟机了,然后会重新加载执行的lua文件。

void resetLuaEngine();
void LuaSupportFactory::resetLuaEngine()
{
MsgLuaFilter::getInstance()->clearGlobalMsgId();
MsgLuaFilter::getInstance()->clearMsgId();
             MsgLuaFilter::getInstance()->clearRootMsgId();
             LuaEngine::getInstance()->getLuaStack()->executeGlobalFunction( "resetup" );
}
local function resetup()
    -- body
    -- 切勿随意调整顺序

    for k, v in pairs(GAME_LOADED_MOD) do
        package.loaded[k] = nil
        GAME_LOADED_MOD[k] = false
    end

    for k, v in pairs(GAME_CUSTOM_GLOBALS) do
        cc.exports[v] = nil
        GAME_CUSTOM_GLOBALS[k] = nil
    end
    cclog("resetup")

    require "packages.init"
    require "app.init"

    i18n:load("app.string", "zh")
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值