下午主要是看了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