如何在C++;卢阿呢? 我一直在寻找教程,演示如何使用API与Lua共享C++对象。大多数教程只是演示如何导出类 >我想开始非常简单,并公开变量(例如,代码> int MyVaR=5 < /COD>),这样Lua的变化将反映在C++应用程序中。

如何在C++;卢阿呢? 我一直在寻找教程,演示如何使用API与Lua共享C++对象。大多数教程只是演示如何导出类 >我想开始非常简单,并公开变量(例如,代码> int MyVaR=5 < /COD>),这样Lua的变化将反映在C++应用程序中。,c++,lua,C++,Lua,有人知道有什么好的教程可以教我如何做吗?听起来你想看看只使用LuaAPI直接修改变量并不是那么简单。您必须创建Lua表或用户数据(分别使用Lua_newtable或Lua_newuserdata),然后创建一个元表-在您的情况下,它应该具有u index和u newindex事件以进行读写访问,并且在这些函数中,您应该按名称匹配变量。手动编写没有乐趣 这就是说,应该非常清楚,您不能在全局Lua级别公开变量-您应该使它成为表/用户数据的成员。这看起来很像Lua中的类/对象,因此只公开一个变量并不比

有人知道有什么好的教程可以教我如何做吗?

听起来你想看看只使用LuaAPI直接修改变量并不是那么简单。您必须创建Lua表或用户数据(分别使用Lua_newtable或Lua_newuserdata),然后创建一个元表-在您的情况下,它应该具有u index和u newindex事件以进行读写访问,并且在这些函数中,您应该按名称匹配变量。手动编写没有乐趣

这就是说,应该非常清楚,您不能在全局Lua级别公开变量-您应该使它成为表/用户数据的成员。这看起来很像Lua中的类/对象,因此只公开一个变量并不比公开一个类简单。此外,公开函数/方法要简单得多。因此,阅读这些关于公开类的教程肯定会有所帮助


但是仅仅使用luaapi仍然没有乐趣。不要误会我的意思,LuaAPI是整洁而伟大的,但是如果你有很多东西要公开,那么它就会变得非常乏味,你要么会编写大量无聊的重复代码来绑定你的类,要么会编写某种工具来为你自动完成这项任务(使用大量宏很可能是你的第一个想法,已经做到了;)。这些工具已经存在,可能还有许多其他工具

如sbk所述,您可以作为userdata的成员访问变量:

print(cside.myVar) -- 5
下面是一些使用luaapi实现这一点的示例代码。它直截了当,虽然单调乏味。您要么想制作自己的代码生成器,要么使用swig或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 );
}
/*gcc-o simple.c-llua-lm-ldl*/
#包括
#包括“lua.h”
#包括“lauxlib.h”
int-myVar=5;
int l_集(lua_状态*l)
{
const char*key=luaL_校验字符串(L,2);
int val=luaL_checkint(L,3);
如果(strcmp(键,“myVar”)==0)
myVar=val;
}
int l_get(lua_州*l)
{
const char*key=luaL_校验字符串(L,2);
如果(strcmp(键,“myVar”)==0)
{
lua_pushinteger(L,myVar);
返回1;
}
}
int main(int argc,char*argv[])
{
const struct luaL_Reg somemt[]=
{
{u__索引,l_get},
{uuuu newindex',l\u set},
{NULL,NULL}
};
lua_State*L=luaL_newstate();
luaL_openlibs(L);
lua_newuserdata(L,sizeof(void*);
luaL_newmetatable(L,“somemt”);
luaL_寄存器(L,NULL,somemt);
lua_可设置元表(L,-2);
lua_setglobal(L,“cside”);
luaL_dostring(L,“print('from Lua:',cside.myVar)”;
luaL_dostring(L,“cside.myVar=200”);
printf(“来自C:myVar=%d\n”,myVar);
}

我真的很想用Lua的API而不是库来实现它,但我会看看。这看起来正是我想要的。我是否可以使用类似的方法来访问数据,如
scene.objects[5].material.diffuseColor.red