如题,cocos-lua是否支持重启整个lua环境?
或者cocos引擎是否支持重启引擎?
1赞
这几天自己研究了下,发现如下方法可以:
将一下代码放在AppDelegate.cpp的 AppDelegate::AppDelegate()
上面
int register_all_packages();
int fix_restart_lua(lua_State * l);
bool regist_lua();
bool regist_lua()//这个函数为原来applicationDidFinishLaunching中内容
{
// register lua module
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
lua_State* L = engine->getLuaStack()->getLuaState();
lua_module_register(L);
register_all_packages();
LuaStack* stack = engine->getLuaStack();
stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));
#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
auto runtimeEngine = RuntimeEngine::getInstance();
runtimeEngine->addRuntime(RuntimeLuaImpl::create(), kRuntimeEngineLua);
runtimeEngine->start();
#else
if (engine->executeScriptFile("src/main.lua"))
{
return false;
}
#endif
return true;
}
int fix_restart_lua(lua_State * l)
{
cocos2d::log("fix_restart_lua");
std::string key = "restart";
CCDirector::getInstance()->getScheduler()->schedule([](float delta){//必须延迟执行,否则会报错
ScriptEngineManager::getInstance()->removeScriptEngine();//把原来的luaEngine销毁
ScriptHandlerMgr::destroyInstance();//把原理注册的函数ID清空
regist_lua();//重新创建luaEngine
}, CCDirector::getInstance()->getRunningScene(),0.1f,0,0.1f,false,key);
return 1;
}
static int register_all_packages()
{//在lua中注册重启lua全局函数
auto L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
lua_register(L, "fix_restart_lua", fix_restart_lua);
return 1; //flag for packages manager
}
然后修改bool AppDelegate::applicationDidFinishLaunching()
bool AppDelegate::applicationDidFinishLaunching()
{
// set default FPS
Director::getInstance()->setAnimationInterval(1.0 / 60.0f);
return regist_lua();
}
以上方法我测试过可以使用,如果大神看到后发现有什么隐患或其他不对的地方请指出。
大佬。。。
有没有不延迟的调用的方法啊???
这个看起来怪怪的。。。