1、Lua六个常用库
math-数学库
table-表库
string-字符串处理库
io-io库
os-系统库
debug-调试库
用法很简单,如:os.date("*t",os.time())--获取格式化的时间,os.time()相当于C中time(0),可以下个LuaStudio输入库直接可看出相关函数。
2、C与Lua调用
//创建新环境,多线程模式下,如果需要独立可创建多个环境
lua_State* pLua = luaL_newstate();
//打开常用的六大库,就上面说的,当然你不想用某些库,也可以打开指定的一些会用到的库luaopen_math,luaopen_string...等
luaL_openlibs(pLua);
//load and call lua file,加载编译并执行lua文件
if(luaL_dofile(pLua, "test.lua"))
{
fprintf(stderr, "dofile lua file error!\n");
lua_pop(m_pLua,1);
}
//注册供lua调用的函数组
static const luaL_Reg funcs[] =
{
"RegAssignTimer", RegAssignTimer
};
//game可以理解为供lua调用C的函数库
luaL_register(m_pLua,"game",funcs);
插段lua
--file test.lua
function main()
RegAssignTimer(os.time() + 10, "ShowInfo")
end
function ShowInfo()
print("HelloWorld,It's lua")
end
好了上面就是我们写的例子,lua注册一个指定时间的定时器,C来提供这个定时效果,再回调lua中的ShowInfo函数
int RegAssignTimer(lua_State* L)
{
time_t uTime = lua_tonumber(L, 1); //栈底开始取参数
char* pszFuncName = lua_tostring(L, 2)
伪代码:将上面信息方法定时调用机制中(指定时间定时器实现,这个不是我们要讨论的重点)
return 1;
}
我们假设时间到了10s过了,怎么调用这个ShowInfo
void ExcuteLuaFunc(const char* pszLuaFunc)
{
lua_getgloabal(pLua, pszLuaFunc); //从lua中获取函数地址
lua_pcall(pLua, 0, 0, 0);//第一个0是参数个数,第二个0是返回结果数
}
//讲到这,顺表提下常用的几个堆栈操作函数
lua_gettop();//获取栈顶的(正值)下标,即获取栈中元素个数
好第一个引入一个概念下标,在lua中栈底到栈顶方向称正方向,由1~n
相反由栈顶到栈底称负方向,-1 ~ -n
那么就简单理解了
lua_gettop为什么是获取栈中元素个数了,获取栈顶元素下标值(正方向)即是最大的,所以也就是此栈的元素数量
同理
lua_settop(pLua, 0); //设置栈顶下标,设置为0,即清空了栈元素
lua_settop(pLua, -(n)-1); //这个一眼看感觉难理解点,也就是lua_pop()宏的实现
表示从栈顶要弹出元素的数量。lua_pop(pLua, 1)<==>lua_settop(pLua, -2); 将栈顶设置为-2,
(注:负方向下标不能和正方向下标直接+-换算)-1是大于-2的,所以-1位置元素被移除,也就是弹出栈顶元素的效果。
向栈中压入数据lua_pushXXX系列自己可以查。
lua_newtable
lua_getglobal
lua_setglobal
lua_gettable
lua_rawgeti
后面有时间补充笔记。。。