}
// -------------------------------------------------------------------------
// @ClientSvr(C/S): S
// @ClassName : --
// @LuaApiName: AddDynamicObstacle
// @Description: 添加一组动态障碍
// @ReturnCode:
// @ArgumentFlag: s table d
// @ArgumentComment: 组名称:不能重复且小于64长度
// @ArgumentComment: 点数组table
// @ArgumentComment: 点数组大小
// @LuaMarkEnd
// -------------------------------------------------------------------------
int LuaAddDynamicObstacle(lua_State* L)
{
Log(eLogInfo, "**************Call script AddDynamicObstacle......");
int nSubWorldID= lua_tointeger(L, 1);
const char* pszName= lua_tostring(L, 2);
int nSize= 0;
XYLOG_FAILED_JUMP(lua_istable(L, 3));
nSize = (int)lua_objlen(L, 3);
XYLOG_FAILED_JUMP(nSize > 0);
for (int i = 1; i <= nSize; i++)
{
int nSubIndex = 0;
int nX = 0;
int nY = 0;
lua_rawgeti(L, 3, i);
nSubIndex = lua_gettop(L);
XYLOG_FAILED_JUMP(lua_istable(L, -1));
lua_rawgeti(L, nSubIndex, 1);
nX = lua_tointeger(L, -1);
lua_rawgeti(L, nSubIndex, 2);
nY = lua_tointeger(L, -1);
Log(eLogInfo, "********* x=%d, y=%d", nX, nY);
}
Log(eLogInfo, "******nSubWorldID=%d, name=%s, size=%d", nSubWorldID, pszName, nSize);
//KSubWorld* pSubWorld = g_SubWorldSet.GetMapByIndex(nSubWorldID);
//if (pSubWorld)
//pSubWorld->AddDynamicObstacle(pszName, points, nSize);
Exit0:
return 0;// /? ReLoadSkill(1,"jhhh", {{2,3},{4,5},{7,9}}) 2.获取到调用者地图 npc身上有
// /? AddDynamicObstacle(1,"ss",{{1,2},{8,188}})
}
明白了:我本省就2个参数压栈,最后自带一个wsId压,3个,lua_rawgeti()会把这个(table)元素压入到栈顶,变成4个元素,
因为栈顶又是个表,所有再次lua_rawgeti(),把这个表的子元素压入到栈顶,然后再取出来,变成6个元素,
下一次遍历的时候,把下一个tab压入栈顶,那就是7了。然后8,9搞定。
5. 对table的一些操作[不引发原方法]
void lua_rawget (lua_State *L, int index)
和lua_gettable操作一样
但是不触发相应的元方法
void lua_rawgeti(lua_State *L, int index, int n)
操作: ele = Stack[index]
value = ele[n]
Stack.push(value)