CCLuaEngine *pEngine = CCLuaEngine::defaultEngine(); //获取lua引擎 (唯一做的事 init m_stack)
CCLuaEngine* CCLuaEngine::defaultEngine(void)
{
if (!m_defaultEngine)
{
m_defaultEngine =newCCLuaEngine();
m_defaultEngine->init();
}
returnm_defaultEngine;
}
bool CCLuaEngine::init(void){
m_stack = CCLuaStack::create();
m_stack->retain();
return true;}
boolCCLuaStack::init(void) //初始化lua栈
{
CCTime::gettimeofdayCocos2d(&m_lasttime,NULL);
m_state =lua_open();
CCAssert(m_state,"create Lua VM failed");
s_map[m_state] =this;
luaL_openlibs(m_state);//打开Lua中的所有标准库,如io库、string库等。
static const luaL_Reg lualibs[] = {
{"", luaopen_base},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},
{LUA_OSLIBNAME, luaopen_os},
{LUA_STRLIBNAME, luaopen_string},
{LUA_MATHLIBNAME, luaopen_math},
{LUA_DBLIBNAME, luaopen_debug},
{NULL, NULL}
};
LUALIB_API void luaL_openlibs (lua_State *L) {
const luaL_Reg *lib = lualibs;
for (; lib->func; lib++) {
lua_pushcfunction(L, lib->func); //函数入栈
lua_pushstring(L, lib->name);
lua_call(L, 1, 0);// 调用函数 函数和参数出栈 返回0个参数入栈 lua c 栈操作
}
}
toluafix_open(m_state);
TOLUA_API void toluafix_open(lua_State* L)
{
lua_pushstring(L, TOLUA_REFID_PTR_MAPPING); //引用 指针 map
lua_newtable(L);//创建一个空 table ,并将之压入堆栈
lua_rawset(L, LUA_REGISTRYINDEX);//LUA_REGISTRYINDEX 伪索引对应一个全局注册表的。在这句执行后 这个表的TOLUA_REFID_PTR_MAPPING索引初始化为空table ,栈复原
// lua_rawset同lua_settable(区别在于这里不触发元方法)
void lua_settable (lua_State *L, int index);作一个价于 t[k] = v 的操作,这里 t 是一个给定有效索引 index 处的值, v 指栈顶的值,而 k 是栈顶之下的那个值。 这个函数会把键和值都从堆栈中弹出。
lua_pushstring(L, TOLUA_REFID_TYPE_MAPPING);
lua_newtable(L);
lua_rawset(L, LUA_REGISTRYINDEX);
lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);
lua_newtable(L);
lua_rawset(L, LUA_REGISTRYINDEX);
}
tolua_Cocos2d_open(m_state);// 将cocos2dxc++的 api注册到lua的全局表中 quick cocos2dx c-lua(3)
// CCB
tolua_extensions_ccb_open(m_state);
// CocoStudio
tolua_CocoStudio_open(m_state);
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
// LuaJavaBridge - Lua 与 Java 互操作的简单解决方案 CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || (CC_TARGET_PLATFORM == CC_PLATFORM_QT && defined(Q_OS_MAC)))
CCLuaObjcBridge::luaopen_luaoc(m_state); //打开lua objective-c互操作api
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CCLuaJavaBridge::luaopen_luaj(m_state);//打开lua java互操作api
#endif
#if (CC_TARGET_PLATFORM != CC_PLATFORM_IOS && CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
// load debugger 载入解释器?????
luaopen_debugger(m_state);
#endif
// register lua print
lua_pushcfunction(m_state,lua_print);
lua_setglobal(m_state,"print");
// register CCLuaLoadChunksFromZIP
lua_pushcfunction(m_state,lua_loadChunksFromZIP);
lua_setglobal(m_state,"CCLuaLoadChunksFromZIP");
// register CCLuaStackSnapshot
luaopen_snapshot(m_state); //Snapshot,也就是快照技术,在backup时被广泛采用。很早就被应用到阵列和主机中,主要采用Copy on Write的算法 .磁盘快照(Snapshot)是针对整个磁盘卷册进行快速的档案系统备份,与其它备份方式最主要的不同点在于「速度」。进行磁盘快照时,并不牵涉到任何档案复制动作。就算数据量再大,一般来说,通常可以在一秒之内完成备份动作。
//将cocos2dxc++的 api注册到lua的全局表中
// chipmunk
luaopen_CCPhysicsWorld_luabinding(m_state);
// cocos-extensions
register_all_cocos2dx_extension_manual(m_state);
// cocos2dx_extra luabinding
luaopen_cocos2dx_extra_luabinding(m_state);
luaopen_CZHelperFunc_luabinding(m_state);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
luaopen_cocos2dx_extra_ios_iap_luabinding(m_state);
#endif
// load WebSockets luabinding
tolua_web_socket_open(m_state);
// lua extensions
luaopen_lua_extensions(m_state);
// add cocos2dx loader
addLuaLoader(cocos2dx_lua_loader);
return true;
}