quick cocos2dx c-lua(2)

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_rawsetlua_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;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值