Ich benutze Lua als Skriptsprache für meine 3D-Engine. Ich habe Lua "Klassen" für mehrere Objekte und jetzt möchte ich Eigenschaften anstelle von Getter und Setter verwenden. Anstatt also so etwas wie diesLua: Methoden und Eigenschaften beim Exportieren von Klassen aus c
local oldState = ui:GetChild("Panel1"):GetVisible()
ui:GetChild("Panel1"):SetVisible(not oldState)
würde ich nur
ui.Panel1.visible = not ui.Panel1.visible
Das Problem ist mein C++ Code für Metatables und instanzierte überschreibt die __index Methode zu schaffen. Hier ist übrigens:
eine Metatabelle erstellen:
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()); }
Instanziieren der Klasse (die lua-Objekt enthält nur einen Zeiger auf einer tatsächlichen Daten, die in C++ Code gespeichert ist):
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; }
Die Frage ist, wie kann ich beide Methoden und Eigenschaften haben. Wenn ich nur __index
zu CLUAScript::RegisterClass
Funcs-Array hinzufügen, wird es nie aufgerufen. Und ich kann mir keinen Weg vorstellen, seine Neudefinition in CLUAScript::NewInstanceClass
zu entfernen.
Wenn dieser Code nicht genug ist, ist hier die Links zu Dateien mit lua arbeiten: lua helper class, functions for UI, functions for Objects und testing lua script
die Verbindung zwischen C++ Code und lua Code zu klären zu helfen, was 'ui' und was bedeutet' ui: GetChild ("property_name ")' Rückkehr? Zum Beispiel, ist 'ui' ein Userdata von C++ Land oder ist es eine Tabelle, die von 'NewInstanceClass' mit '__self = udata_object' zurückgegeben wird? – greatwolf
Das "ui" ist eine Instanz eines UI-Elements wie Schaltfläche, Panel oder ein gesamter Bildschirm. Jedes Element kann untergeordnete Elemente enthalten, die mit der GetChild (name) -Methode aufgerufen werden können. Diese Childs sind auch UI-Elemente. Dies ist also eine Tabelle, die einen Zeiger auf C++ - Instanz als Benutzerdaten und einige Methoden aus Metatabelle enthält, die von der NewInstanceClass-Funktion zurückgegeben werden. In diesem Fall ist "ui" eine lokale Variable, die den gesamten Bildschirm darstellt (das Wurzelelement der UI-Struktur). –
Was ist, wenn Sie 'GetChild' und' GetVisible' freistehende Funktionen in lua machen? Dann können Sie 'ui.Panel1' als eine Form von Syntax Sugar machen, die in' GetChild (ui, "Panel1") übersetzt wird. – greatwolf