gpt4 book ai didi

c - C 中的嵌套 Lua 元表

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:43 26 4
gpt4 key购买 nike

在 3D 场景中,我有一个对象,它有一个我想使用 Lua 移动的位置。

例如。 box.position.x = 10

box 有一个元表(“Object”),因此有一个位置(“Vec”)。对象设置了 __newindex__index 分别调用 C 函数 NewIndexObjectIndexObject。与 Vec 相同(NewIndexVecIndexVec)。

对象有一个 id,所以它可以在存储在场景中的列表中被识别,当 box.position 被访问时一切正常,C 函数 IndexObject 被调用,我可以提取id 来自堆栈,它只是在执行 box.position.x = 10 时 'NewIndexVec' 被调用并且堆栈上唯一的东西是 {table, x, 10} 所以无法识别对象更改其 x 位置。

有没有办法将值推送到本地状态?帮助!

更新:感谢您快速回复我,下面我已经尽可能多地提炼了代码。如果你运行这段代码,它似乎可以工作,但我在卡住的地方有评论,它只是获取数组中的第一个对象,但我需要通过它的 ID 选择它,提前致谢

struct Obj
{
std::string id;
int x,y,z;
Obj()
{
x = 10; y = 20; z = 30;
id = "12345";
}
};

//array of external objects
std::vector<Obj> objects;

int NewObject(lua_State * L)
{
Obj obj;
objects.push_back(obj);

lua_newtable(L);

luaL_getmetatable(L, "MT_Object");
lua_setmetatable(L, -2);

lua_pushstring(L, "id");
lua_pushstring(L, obj.id.c_str());
lua_settable(L, 1);

lua_newtable(L);
luaL_getmetatable(L, "MT_Vec");
lua_setmetatable(L, -2);

lua_pushinteger(L, obj.x);
lua_setfield(L, -2, "x");

lua_pushinteger(L, obj.y);
lua_setfield(L, -2, "y");

lua_pushinteger(L, obj.z);
lua_setfield(L, -2, "z");

lua_setfield(L, -2, "position");



return 1;
}

int IndexVec(lua_State * L)
{
// How do I get the correct object so I can pass its value back
Obj &dunnoObj = objects[0];

std::string key = luaL_checkstring(L,-1);
if(key == "x")
lua_pushinteger(L,dunnoObj.x);
else if(key == "y")
lua_pushinteger(L,dunnoObj.y);
else if(key == "z")
lua_pushinteger(L,dunnoObj.z);
return 1;
}


int NewIndexVec(lua_State * L)
{
// How do I know which object's value to update
Obj &dunnoObj = objects[0];

std::string key = luaL_checkstring(L,-2);
int value = luaL_checkinteger(L,-1);

if(key == "x")
dunnoObj.x = value;
else if(key == "y")
dunnoObj.y = value;
else if(key == "z")
dunnoObj.z = value;

return 0;
}

int main()
{
lua_State * L = luaL_newstate();
luaL_openlibs(L);


luaL_Reg objreg[] =
{
{ "new", NewObject },
{ NULL, NULL }
};
luaL_newmetatable(L, "MT_Object");
luaL_register(L, 0, objreg);
lua_setglobal(L, "Object");


luaL_Reg reg[] =
{
{ "__index", IndexVec },
{ "__newindex", NewIndexVec },
{ NULL, NULL }
};
luaL_newmetatable(L, "MT_Vec");
luaL_register(L, 0, reg);
lua_setglobal(L, "Vec");


int res = luaL_dostring(L, "box = Object.new() box.position.x = 1000 print(box.id .. \" , \" ..box.position.x .. \" , \" .. box.position.y .. \" , \" .. box.position.z)");
if(res)
printf("Error: %s\n", lua_tostring(L, -1));



lua_close(L);

return 0;
}

最佳答案

如果我对你的理解是正确的,你不需要做任何事情。表格通过引用进行跟踪,因此如果 NewIndexVec 的第一个参数是 box.position,则它不需要知道有关 box 的任何信息。

如果这个答案由于某种原因不能工作,那么我需要更多关于你的数据结构的信息来理解你的问题。

基本上,box.position 需要返回一些 obj ,其中 obj.x = 10 是一个有效的操作,并准确地改变你想要改变。


问题在于您试图将相同的数据保存在两个不同的位置。将所有数据保存在 C++ 结构中,然后让 NewObject 返回一个伪装成表的用户数据。 Object 和 position 字段应该是相同的 Obj*,但它们可能有不同的元表来模拟不同的字段集。

关于c - C 中的嵌套 Lua 元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com