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

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

1

19.03.2008, 11:43

Lua Threadprogrammierung

Wie der Titel schon sagt, möchte ich in meinem c++Spiel einen Thread starten, der in Lua geschrieben ist. Einfache Lua-Scripte mit c++Funktionaufrufen hab ich schon zum laufen gebracht aber zur Threadprogrammierung hab ich eigenartigerweise kein relevantes tut gefunden.

Ich habe bereits Erfahrung in Threadprogrammierung mit der SDL, also das Prinzip von Multi-threading verstehe ich. Mir reicht ein Lua-Spezifischer Artikel oder Tipp.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

2

19.03.2008, 12:02

Ich glaub ich hab doch was gefunden
http://www.lua.org/manual/5.1/manual.html#2.11

mal sehen ob mir das weiterhilft

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

3

19.03.2008, 16:10

Es hat mir weitergeholfen. Jetzt hab ich aber ein anderes Problem:

Mit dem LuaScript möchte ich etliche Variablen meines Spieles auslesen und verändern. Muss ich da jetzt extra für jede Variable eine Funktion schreiben?

Und weiter: Wenn ich jetzt viele gegnerische Raumschiffe mit jedem seinen eigenen Script steuern will, wie mach ich das? Meine Lösung wäre für jedes eine eigene ID wobei der einzelne Script dann die dazugehörige ID einliest, und den Zugriff auf die Raumschiffdaten bekommt, indem er die ID und den String des Variablennamen(:() an eine c++Funktion liefert. also:

Quellcode

1
2
3
4
5
6
7
8
(c++ code wäre ohne Lua)
int GetValue (int ID, string sString){
if (!sString.compare("Ball.speed"))
  return Ball.speed;
else if ...

return 0
}

und eine ähnliche Funktion nochmal für s Ändern von Variablen.
Das is mir zu viel arbeit und die Verwendung von Lua wäre nur Overkill

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

19.03.2008, 16:29

Lua ermöglicht doch auch Objektorientierte Programmierung. Das würde ich zumindest bei den Raumschiffen nutzen.

Was sind denn das für Variablen? Ich würd die einfach in ne Map packen, dann kannst du die doch total einfach ändern ;) Wenn es irgendwelche Konfigurationswerte oder so sind, würde ich dafür auch ne eigene Klasse schreiben.

5

19.03.2008, 16:48

Vieleicht hilft dir dieser Link

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

6

19.03.2008, 16:54

Mein Problem ist im Allgemeinen dass ich mit dieser onlinedokumentation (siehe link oben) wenig anfangen kann. Das notwendigste verstehe ich schon noch aber irgendwann steige ich aus. Es geht einfach zu schnell und es ist so viel was ich auch nicht brauch.

zur Objektorientierung hab ich noch nix gelesen (Naja, mit Maps kann man ein Objekt erstellen wenn man eine Map für die Variablennamen verwendet und mit diesen dann nochmal maps benennt, die den entgültigen Wert haben. Das ist nirgendwo gestanden aber ich denke das es so gehen muss), genausowenig wie man Zeiger auf Variablen an Lua übergibtt.

//Edit: danke chriss: durch dich bin ich drauf gekommen was das Gurke gemaint hat (auch danke :)): Metatables. Den Artikel hab ich überflogen weil ich ihn nicht verstanden hab. Dann kau ich mich da mal durch :?
//Edit2: doch nicht metatable: das sind soweit ich verstanden habe nur überladene operatoren. Aber es muss irgendwas mit userdata sein, dazu steht kaum was in der dokumentation, außer dass man variablen dieses types mit Lua nicht verändern kann :? ist das dann überhaupt das richtige für mein Problem?
//Edit3: So, chrisss link nochmal durchgelesen und ich verstehe immer mehr. Aber bei mir mangelt es halt an Lua Kenntnissen. Hab gestern erst angefangen und außer einem Anfängertut noch kein gutes Tutorial gefunden.

7

19.03.2008, 18:54

Hi niedo, freut mich das es dir was bringt.

Ehrlich gesagt benutze ich Lua mit C++ nicht wirklich ( hab manchmal damit probiert aber noch nichts weiterführendes).
Den Link hab ich durch Google gefunden und ein kurzes durchlesen schien genau das zu bringen was du wolltest.

Ich selbst benutze Lua mit C# über das Luainterface.

Zum Link.
Die machen nichts anderes als eine Klasse in C++ zu definieren und eine Wrapperklasse zu schreiben, welche sich dann um den Austausch zwischen Lua und der C++ Klasse kümmert.

Für Spiele ist dieses Beispiel allerdings perfekt da sie im C++ Code ein Objekt erstellen und in Lua als globale/globales Variable/Objekt zugänglich machen.

Die entscheidende Pasage wie das Objekt in Lua landet ist,

C-/C++-Quelltext

1
2
3
4
// Push a pointer to this GameObject to the Lua stack

lua_pushlightuserdata(L, (void*)&temp);
// And set the global name of this pointer

lua_setglobal(L,"gameobject");

, zu finden in der Erklärung der Datei main.cpp

Zu OOP in Lua.
Unter der Voraussetzung das du das Objekt wie im beispiel in C++ erzeugt hast und es in Lua 'nur' benutzt kannst du folgendes machen.

Eine Methode aufrufen

Quellcode

1
2
3
4
5
-- Ohne Parameter
Referenzname:Methodenname()

-- Mit Parameter
Referenzname:Methodenname(1234 , "Test")


Ein öffentliches Attribut verwenden

Quellcode

1
2
3
4
5
-- Einen Wert setzen
Referenzname.Attributname = "Hallo Welt"

-- Einen Wert auslesen
meineVariable = Referenzname.Attributname


Ich hoffe das hat noch was gebracht. Wenn nicht, schreib mal an welchem Teil es hängt.

Grüße


EDIT: Hier noch ein gutes online Buch, leider aber nur für Lua in C und daher ohne OOP. OOP wird in diesem Artikel beschrieben.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

8

20.03.2008, 10:24

danke chriss! Das war genau das was ich gebraucht habe. Mal sehen ob das so geht wie ich es denke.
//Edit: Nein es geht so nicht.
Ich mache das folgendermaßen. Hilfsfunktion:

C-/C++-Quelltext

1
2
3
4
5
template <class T>
void CLuaManager::UseClass(T *Class, string sName){
    lua_pushlightuserdata(pLuaInstance, (void *)Class);
    lua_setglobal(pLuaInstance, sName.c_str()); 
};

Einbindung in Lua:

C-/C++-Quelltext

1
LuaManager.UseClass<CBall>(&Ball, "Ball");

Lua code:

Quellcode

1
2
3
print "Start Lua";
print (Ball.BounceForce);
print "EndLua";

nach dem ersten print bricht er ab.

Ich denke irgendwie dass es daran liegt dass ich kein Luna verwende. Brauche ich das dafür?

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

9

20.03.2008, 15:00

Ich hab die Artikel jetzt durchgelesen und habe daraus entnommen, dass Lua für mein Vorhaben nicht die richtige Scriptsprache ist, es gibt viel zu viele Einschränkungen. Allerdings kann ich mir dann auch nicht vorstellen, wieso so viele c++Progger diese Scriptsprache verwenden. Da muss es ja einfacher sein sich eine eigene zu schreiben. Anscheinend verstehe ich das Konzept einfach nicht.

Zitat von »"Das Gurke"«


Lua ermöglicht doch auch Objektorientierte Programmierung. Das würde ich zumindest bei den Raumschiffen nutzen.

Was sind denn das für Variablen? Ich würd die einfach in ne Map packen, dann kannst du die doch total einfach ändern Wink Wenn es irgendwelche Konfigurationswerte oder so sind, würde ich dafür auch ne eigene Klasse schreiben.


Was hast du damit gemeint? Ich hab nichts dergleichen gefunden? In chrisss OOP Link wird eine Klasse erstellt auf deren Elemente man nur mithilfe selbst geproggter Funktionen zugreifen kann. Das wäre ja auch das gewesen was ich oben vorgeschlagen habe und weswegen ich die Frage überhaupt gestellt habe.

Zitat von »"chriss"«

Unter der Voraussetzung das du das Objekt wie im beispiel in C++ erzeugt hast und es in Lua 'nur' benutzt

was meinst du eigentlich mit 'nur'? was kann man noch mit einem Objekt machen außer es benutzen?

meine Frage lautet jetzt direkt: Wie kann ich mit Lua c++ variablen manipulieren ohne für jede einzige eine eigene funktion zu schreiben?

Ich bin völlig verwirrt und kurz davor Lua einfach fallen zu lassen. Möglicherweise sind meine Programmierskills einfach noch nicht so weit.

[/quote]

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

10

20.03.2008, 15:04

Ja, schau dir mal std::map an ;) Dann kannst du die Variablen in Lua etwa so setzen:

Quellcode

1
Spaceship.setAtribute("Speed", 25)


Alles andere erfordert Handarbeit im Code. Das kann man aber über Bindings wie tolua++ automatisch erledigen. So macht das z.B. CeGUI, vielleicht schaust du dir das System dort ja mal an.

Werbeanzeige