[lua]Lua笔记

来源:互联网 发布:十八剁开山刀淘宝网 编辑:程序博客网 时间:2024/05/16 17:25

下午主要是看了lua的一些资料,搞懂了wow是怎样使用ui和lua的.
如下:
+-------------------+   +-------------------+   +---------------+  
| 用户定义的xml     |   | WoW UI处理程序    |   | 使用lua接口   | 
| 主要定义了操作的  |   | 其实主要是input   |-->| 调用.lua_file |---| 
| 关键字(key)和     |   | 处理              |   +---------------+   |
| lua的function     |-->+-------------------+                       |
| 还有核心的lua脚本 |                       +---------------+<------|
| 的位置            |                       | 用户定义的lua |
+-------------------+                       | 调用游戏接口  |
                        +---------------+<--+---------------+
                        | game kernle   |
                        +---------------+
还有就是一些lua调用的笔记:
Lua 与宿主语言之间的这种共生关系的核心是宿主语言是一个虚拟堆栈. 虚拟堆栈与实际堆
栈类似,是一种后进先出(LIFO)的数据结构,可以用来临时存储函数参数和函数结果.要从
Lua 中调用宿主语言的函数(反之亦然),调用者会将一些值压入堆栈中,并调用目标函数;被
调用的函数会弹出这些参数(当然要对类型和每个参数的值进行验证),对数据进行处理,然后
将结果放入堆栈中. 当控制返回给调用程序时,调用程序就可以从堆栈中提取出返回值.
 ..
 if (luaL_loadfile(L,filename) || lua_pcall(L,0,0,0))
   error(L,"cannot run configuration file: %s",lua_tostring(L,-1));

 lua_getglobal(L,"width");
 lua_getglobal(L,"height");
 ..
 width = (int) lua_tonumber(L,-2);
 height = (int) lua_tonumber(L,-1);
 ..
请再次注意传输是通过堆栈进行的. 从 C 中调用任何 Lua 函数与这段代码类似: 使用
lua_getglobal() 来获得函数,将参数压入堆栈,调用 lua_pcall(),然后处理结果.如果 Lua
函数返回 n 个值,那么第一个值的位置在堆栈的 -n 处,最后一个值在堆栈中的位置是 -1.
还有要注意的是貌似lua提供的库使用的是hpp的模板...不知道怎么用.
我这里有一个非常有趣的范例,关于hpp怎么用? 直接include就可以了.
 这一个例子就是用来说明如何通过C语言,注册一个static的函数到lua的虚拟机中. 然
 后通过C语言调用lua中的一个函数. lua中的这个函数又会调用C语言中注册的这个函数

 #include <iostream>
 #include <lua.hpp>
 #pragma comment(lib,"luastatic")

 using namespace std;
 // 函数定义
 static int l_dir(lua_State *L)
 {
  cout<<"第一个参数"<<luaL_checkstring(L,1)<<endl;
  cout<<"第二个参数"<<luaL_checknumber(L,2)<<endl;
  cout<<"hi"<<endl;
  return 0;
 }

 static const struct luaL_reg mylib[]={
  {"dir",l_dir},
  {NULL,NULL}
 };

 int luaopen_mylib(lua_State *L)
 {
  luaL_register(L,"mylib",mylib);
  return 0;
 }
 int main()
 {
  lua_State *L=luaL_newstate();
  luaopen_mylib(L);
  luaL_dofile(L,"d://test.lua");

  // 调用一个函数
  lua_getglobal(L,"f");
  lua_pushnumber(L,2);
  lua_pushnumber(L,3);
  lua_pcall(L,2,1,0);
  lua_close(L);
  return 0;
 }

 --[[
 lua定义出来的文件.
 --]]
 function f (x,y)
  return mylib.dir("string",100)
  -- return (x^2*math.sin(y))/(1-x)
 end

 

原创粉丝点击