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

5096

被折叠的 条评论
为什么被折叠?



