Du bist nicht angemeldet.

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

Stazer

Alter Hase

  • »Stazer« ist der Autor dieses Themas

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

21

07.10.2009, 13:21

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)


könntest du das eventuell auf des ersten posts anwenden?
werde daraus nicht so ganz schlau

22

07.10.2009, 15:00

Wenn du ein Beispiel zu luna brauchst
http://wwi07.ww.funpic.de/extern/LuaClass.zip

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

23

07.10.2009, 16:58

Muss es denn lua sein? Gibt auch noch einige andere Skriptsprachen mit durchaus grundsoliden Bindings. Ich selbst habe ne zeitlang lua und squirrel genutzt. Als nächstes will ich mir ma python (boost.python) anschauen. Nur so als dezenter Tipp :) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

24

07.10.2009, 17:07

Ich gehe mal davon aus, dass du C++ Code aus Lua heraus aufrufen moechtest.

Zitat

könntest du das eventuell auf des ersten posts anwenden?

Dein Ansatz ist schon falsch. Du hast C++ Objekte. Diese existieren ganz unabhaengig in deinem Programm. Sie wissen nichts von Lua und Co.

Sie haben vor allem keine Methoden von der Art

C-/C++-Quelltext

1
2
3
class Test {
    int helloworld ( lua_State * LuaInstance );
    ...


Sie sind eher so:

C-/C++-Quelltext

1
2
3
class Test {
    int helloworld();
    ...


Nun moechtest du gern die Methode helloworld von Lua aufrufen. Gut, du brauchst erstmal eine Funktion, die dir ein Test-Objekt erzeugt oder aber einen Pointer auf ein solches in einen light user data verpackt. Dann natuerlich die Bindingfunktion:

C-/C++-Quelltext

1
int test_helloworld_binding(lua_State* L)


Auf dem Stack lua_State* L befinden sich nun Werte. Wieviele kann durch lua_gettop herausgefunden werden. Dann extrahierst du den ersten, castest auf Test* und rufst ueber ->helloworld() die entsprechende Methode auf.

Ein gut fuer den Einstieg ist der Artikel in Games Programming Gem 6: Binding C/C++ Objects to Lua.

Zitat

Muss es denn lua sein?

Die gleichen Probleme hast du auch mit anderen Skriptsprachen, wobei Probleme das falsche Wort ist.
If it were not for laughter, there would be no Tao.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

25

07.10.2009, 18:54

Ja und nein. Lua kennt von sich aus ja keine Klassen. Das ist bei Squirrel/python anders. Squirrel ist halt eine sehr kleine und leichte Lösung unterstützt aber z.b. nicht nativ die STL, weshalb ich von dieser Lösung wieder abwich. Bei Boost.Python muss man sich noch nichtmal ums Binding kümmern, denn es gibt wohl entsprechende Tools, die die Header durchparsen und die Bindings automatisch erstellen. Natürlich ist da wohl manchmal tweaking notwendig. Aber Boost.Python kann wohl direkt auch mit den STL Sachen umgehen. Sprich man muss da nicht noch erst Iteratoren etc.pp. gesondert behandeln bzw vermeiden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Stazer

Alter Hase

  • »Stazer« ist der Autor dieses Themas

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

26

07.10.2009, 21:48

was meinst du mit extrahieren?

27

08.10.2009, 10:48

Zitat

Lua kennt von sich aus ja keine Klassen.

Das stimmt, aber mit den Tabellen und Metatabellen ist es ein leichtes, das nachzubilden. Ich habe auch nicht wirklich andere Scriptingmoeglichkeiten getestet, da ich sehr zufrieden mit Lua war. Auch wollte ich nicht sowas wie Iteratoren gescripted wissen, da die Scriptingumgebung von solchen Detailsachen abstrahieren sollte.
If it were not for laughter, there would be no Tao.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

28

08.10.2009, 13:14

Das ist der Unterschied. Python scheint listen usw von sich aus zu kennen. Somit ist eine entsprechende Anbindung eig. nur eine logische Konsequenz. Aber ich muss mich auch erstmal in Python einlesen. Mal schauen was bei rum kommt.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

29

08.10.2009, 16:32

Zitat von »"Stazer"«

was meinst du mit extrahieren?

Ich teste das erste Element, ob er ein light user data ist und weise ihn der lokalen Variablen (hier udata, wie user data) zu.

C-/C++-Quelltext

1
2
luaL_checktype(L, 1, LUA_TUSERDATA); 
void** udata = (void**)lua_touserdata(L,1);
If it were not for laughter, there would be no Tao.

Stazer

Alter Hase

  • »Stazer« ist der Autor dieses Themas

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

30

08.10.2009, 17:08

hab das problem nun so gelöst das ich einen namensraum erstellt habe in dem ein zeiger der klasse reinkommt
außerdem funktionen die die lua funktionen der klasse aufrufen
danke an alle =)

Werbeanzeige