Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"knivil"«
Ich habe das damals selbst gestrikt, da mir luabind a) auch zu umstaendlich war und b) ich etwas anderes suchte.
Fuer Objekte musst du fuer jede Methode eine freie Funktion implementieren, das Binding halt. Einfaches Beispiel eines Objekts fuer die Methode implements:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class IObject { public: virtual ~IObject() {}; virtual const char* classname() const ; virtual bool implements(const char* interface) const;; }; int iobject_implements(lua_State* L) { int argc = lua_gettop(L); if (argc != 2) // test number of arguments: object pointer + methode parameter { luaL_error(L,"%s","wrong number of arguments, 2 expected"); } luaL_checktype(L, 1, LUA_TUSERDATA); void** udata = (void**)lua_touserdata(L,1); // type check ... const char* s = luaL_checkstring(L,2); // cast void* to correct type and call methode implements // push the string on the lua stack as return argument lua_pushboolean(L,static_cast<IObject*>(*udata)->implements(s)); // one return value return 1; }
Wie du das ganze in der Runtime von Lua registriest und entsprechende Tabellen und Metatabelleneintraege setzt, ob du noch was am Verhalten des garbage collectors aendern moechtest , musst du fuer deinen konkreten Fall selbst entscheiden.
Hier wurde die Variante "light user data" benutzt, die vorwiegend mit Zeigern arbeitet, andere wie "full user data" arbeitet mit ganzen Speicherbloecken in dem das Objekt enthalten ist. (Ich pushe und poppe lieber Zeiger auf den Stack als ganze Objekte)
Zitat
könntest du das eventuell auf des ersten posts anwenden?
C-/C++-Quelltext |
|
1 2 3 |
class Test { int helloworld ( lua_State * LuaInstance ); ... |
C-/C++-Quelltext |
|
1 2 3 |
class Test { int helloworld(); ... |
C-/C++-Quelltext |
|
1 |
int test_helloworld_binding(lua_State* L) |
Zitat
Muss es denn lua sein?
Zitat
Lua kennt von sich aus ja keine Klassen.
Zitat von »"Stazer"«
was meinst du mit extrahieren?
C-/C++-Quelltext |
|
1 2 |
luaL_checktype(L, 1, LUA_TUSERDATA); void** udata = (void**)lua_touserdata(L,1); |
Werbeanzeige