C++读取Lua表进栈出栈过程

shake.lua表如下:

shake = {} 

shake[1] = {
   {mode = 1,--震动的模式
    t = 40,
    x = 0,--持续的次数
    y = -6,--等待的时间
    z = 0,
   },
   {mode = 1,--震动的模式
       t = 40,
       x = 0,--持续的次数
       y = 0,--等待的时间
       z = 0,
   }
}
shake[2] = {
    {mode = 1,--震动的模式
        t = 40,
        x = 0,--持续的次数
        y = -15,--等待的时间
        z = 0,
    },
    {mode = 1,--震动的模式
        t = 40,
        x = 0,--持续的次数
        y = 5,--等待的时间
        z = 0,
    },
    {mode = 1,--震动的模式
        t = 40,
        x = 0,--持续的次数
        y = -10,--等待的时间
        z = 0,
    }

}

C++怎么读取呢,代码如下:

void ShakeManager::shakeById(int Id){

    //获取Lua上下文环境

    lua_State*  ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();

    lua_getglobal(ls, "shake");//将shake.lua表压入堆栈
    
    int statesCode = lua_istable(ls, -1);
    if(statesCode!=1){
        CCLOG("Open Lua Error: %i", statesCode);
        return;
    }

    lua_pushinteger(ls, Id);//将Id压栈
    lua_gettable(ls, -2);//获取shake中key为Id对应的表,即shake[1]  = {},shake[2] = {} 并压栈
    
    Vector<ShakeData *> shakedata;
    shakedata.clear();
    int size=lua_objlen(ls,-1);//获取栈顶位置表的长度,此时栈顶为shake[1]或shake[2]
    for (int i = 1;i<=size;i++){
        lua_pushinteger(ls, i);//将i压栈,i为shake[1] 或shake[2]中字表索引值或key值 
        lua_gettable(ls, -2);//将字表{mode = 1,t = 40,x = 0,y = -6,z = 0}压栈
        ShakeData *info = ShakeData::create();
        lua_getfield(ls, -1, "mode");//mode压栈
        info->shakeID =(int)lua_tointeger(ls, -1);//获取栈顶值,即mode的值并赋值给另一变量
        lua_pop(ls, 1);//mode出栈
        lua_getfield(ls, -1, "t");//t压栈
        info->shakeTime =(int)lua_tointeger(ls, -1);//获取栈顶值,即t的值并赋值给另一变量
        lua_pop(ls, 1);//t出栈
        lua_getfield(ls, -1, "x");//x压栈
        info->shakeX =(int)lua_tointeger(ls, -1);//获取栈顶值,即x的值并赋值给另一变量
        lua_pop(ls, 1);//x出栈
        lua_getfield(ls, -1, "y");//y压栈
        info->shakeY =(int)lua_tointeger(ls, -1);//获取栈顶值,即y的值并赋值给另一变量

        lua_pop(ls, 1);//y出栈

        lua_getfield(ls, -1, "z");//z压栈
        info->shakeZ =(int)lua_tointeger(ls, -1);//获取栈顶值,即z的值并赋值给另一变量
        lua_pop(ls, 1);//z出栈
        shakedata.pushBack(info);
        lua_pop(ls, 1);//{mode = 1,t = 40,x = 0,y = -6,z = 0}出栈,进入下一循环
    }
    lua_pop(ls, 1);//shake[1]  = {}或shake[2] = {}出栈

}

下一篇博文会给出示意图,以上只是个人理解,如有不当之处,还请指正。

猜你喜欢

转载自blog.csdn.net/guominyou/article/details/80541577