Я использую lua в качестве языка сценариев для своего 3d-движка. У меня есть «классы» для нескольких объектов, и теперь я хочу использовать свойства вместо геттеров и сеттеров. Так что вместо того, чтобы что-то вроде этогоLua: методы и свойства при экспорте класса из c
local oldState = ui:GetChild("Panel1"):GetVisible()
ui:GetChild("Panel1"):SetVisible(not oldState)
Я бы просто
ui.Panel1.visible = not ui.Panel1.visible
Проблема мой C++ код для создания метатаблицы и инстанс переопределяет метод __index. Здесь, кстати:
Создайте метатаблицу:
void CLUAScript::RegisterClass(const luaL_Reg funcs[], std::string const& className) { luaL_newmetatable(m_lua_state, std::string("Classes." + className).c_str()); luaL_newlib(m_lua_state, funcs); lua_setglobal(m_lua_state, className.c_str()); }
экземпляр класса (объект Lua имеет только указатель на фактических данных, которые хранятся в C++ код):
int CLUAScript::NewInstanceClass(void* instance, std::string const& className) { if (!instance) { lua_pushnil(m_lua_state); return 1; } luaL_checktype(m_lua_state, 1, LUA_TTABLE); lua_newtable(m_lua_state); lua_pushvalue(m_lua_state,1); lua_setmetatable(m_lua_state, -2); lua_pushvalue(m_lua_state,1); lua_setfield(m_lua_state, 1, "__index"); void **s = (void **)lua_newuserdata(m_lua_state, sizeof(void *)); *s = instance; luaL_getmetatable(m_lua_state, std::string("Classes." + className).c_str()); lua_setmetatable(m_lua_state, -2); lua_setfield(m_lua_state, -2, "__self"); return 1; }
вопрос заключается в том, как я могу иметь оба свойства и методы. Если я просто добавлю __index
в CLUAScript::RegisterClass
funcs array, он никогда не вызывается. И я не могу себе представить, как удалить его переопределение в CLUAScript::NewInstanceClass
.
Если этот код не хватает, вот ссылки на файлы, работающих с Lua: lua helper class, functions for UI, functions for Objects и testing lua script
Чтобы уточнить связь между кодом и Lua кода C++, что 'ui' и что делает' Ui: GetChild ("property_name ")' return? Например, 'ui' пользовательские данные из земли C++ или это какая-то таблица, возвращаемая' NewInstanceClass' с набором '__self = udata_object'? – greatwolf
«ui» - это экземпляр элемента пользовательского интерфейса, например кнопки, панели или всего экрана. Каждый элемент может иметь дочерние элементы, которые можно использовать с помощью метода GetChild (name). Эти дочерние элементы также будут элементами пользовательского интерфейса. Таким образом, это таблица, содержащая указатель на экземпляр C++ как userdata и некоторые методы из metatable, возвращаемые функцией NewInstanceClass. В этом случае «ui» является локальной переменной, которая представляет весь экран (корневой элемент дерева UI). –
Что делать, если вы выполняете функции 'GetChild' и' GetVisible' в lua? Затем вы можете просто сделать 'ui.Panel1' как форму синтаксического сахара, которая переводится в' GetChild (ui, "Panel1") '. – greatwolf