2009-09-22 33 views
2

我一直在寻找教程,演示如何使用API​​与Lua共享C++对象。大多数教程仅显示如何导出类。如何在C++和Lua之间共享数据?

我想开始非常简单,并暴露一个变量(例如int myVar = 5),以便Lua中的变化将反映在C++应用程序中。

有谁知道任何好的教程可以告诉我如何做到这一点?

回答

3

正如SBK提到的,你会访问您的变量作为用户数据中的一员:

print(cside.myVar) -- 5 

下面是一些示例代码来执行此使用Lua的API。它直截了当,虽然乏味。你要么想使自己的代码生成器或使用类似痛饮或tolua ++

/* gcc -o simple simple.c -llua -lm -ldl */ 
#include <stdio.h> 

#include "lua.h" 
#include "lauxlib.h" 

int myVar = 5; 

int l_set(lua_State *L) 
{ 
const char *key = luaL_checkstring(L, 2); 
int val = luaL_checkint(L, 3); 

if (strcmp(key, "myVar") == 0) 
    myVar = val; 
} 

int l_get(lua_State *L) 
{ 
const char *key = luaL_checkstring(L, 2); 

if (strcmp(key, "myVar") == 0) 
{ 
    lua_pushinteger(L, myVar); 
    return 1; 
} 
} 

int main(int argc, char *argv[]) 
{ 
const struct luaL_Reg somemt[] = 
{ 
    { "__index", l_get }, 
    { "__newindex", l_set }, 
    { NULL, NULL } 
}; 

lua_State *L = luaL_newstate(); 
luaL_openlibs(L); 

lua_newuserdata(L, sizeof(void *)); 

luaL_newmetatable(L, "somemt"); 
luaL_register(L, NULL, somemt); 
lua_setmetatable(L, -2); 

lua_setglobal(L, "cside"); 

luaL_dostring(L, "print('from Lua:', cside.myVar)"); 
luaL_dostring(L, "cside.myVar = 200"); 

printf("from C: myVar = %d\n", myVar); 
} 
2

这听起来像你想看看tolua++

+0

我真的很期待与Lua的API,而不是使用库做到这一点,但我给它看看。 – 2009-09-22 20:43:33

5

暴露你的变量仅使用Lua的API直接修改是不是所有的简单。你必须创建(分别使用lua_newtablelua_newuserdata函数),然后创建一个元表的Lua表或用户数据 - 在你的情况下,它应该有读写访问,并在那些__index__newindex事件函数应该按名称匹配变量。手动编写这没有意思。这就是说,应该很清楚你不能在全局Lua级暴露一个变量 - 你应该让它成为表/ userdata的成员。这看起来很像Lua的类/对象,所以只暴露一个变量并不比公开一个类更简单。更重要的是,暴露函数/方法要简单得多。所以阅读这些关于揭露类的教程肯定会有帮助。

但是仅使用Lua API仍然没有乐趣。不要误解我的意思,Lua API非常好,但是如果你有很多需要暴露的话,那么它会变得非常乏味,最终你会写很多无聊的重复代码来绑定你的类或者写一些工具为你自动执行这个任务(使用大量的宏很可能是你的第一个想法,在那里,做到这一点))。这样的工具已经存在,tolua++,luabind,可能还有其他很多。

+0

这看起来像我正在寻找的。我是否可以使用类似的方法来进一步扩展这些数据,比如'scene.objects [5] .material.diffuseColor.red'? – 2009-09-25 14:33:29