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

FBI

Frischling

  • »FBI« ist der Autor dieses Themas
  • Private Nachricht senden

1

06.07.2007, 11:02

Luabind

Hi,

ich möchte mich langsam mal an Lua heranwagen, da ich für mein Projekt eine Scriptsprache benötige.

Bevor ich die eigentliche Frage stelle, möchte ich mal die Ausgangssituation schildern:
Ich habe ein Objekt meiner Klasse "Game", welches die aktuell laufende Spielinstanz repräsentiert. Darin gibt es dann in erster Linie die Memberfunktionen Init(), Quit() und Run(). Run() beinhaltet eine Schleife, welche die eigentliche Spielschleife darstellt.

Außerdem verwaltet die Game-Klasse alles mögliche, wie z.B. Spieler, Gegner, andere Objekte, Tastatur- und Mauseingaben etc. - eigentlich alles, was für das Spiel relevant ist.

Der Spielablauf soll jetzt allerdings nicht nur durch Zufall bestimmt sein, sondern, ihr ahnt es schon, durch ein Script. Ich möchte also eine Script-Datei haben, die auch hinterher noch leicht zu modifizieren ist, welche bestimmt, wann z.B. neue Gegner auftauchen, wann sie ihr verhalten wechseln etc. So soll es z.B. möglich sein, dass wenn der Spieler Objekt A zerstört hat, dass dann 5 neue Gegner erstellt werden (nur ein Beispiel). Dazu hat ja die Game-Klasse Zugriff auf alle Spieler, Gegner etc. Nur muss jetzt in der Run()-Funktion eben noch die Script-Datei abgearbeitet werden, udn der Scriptsprache müssen einige Funktionen zur Verfügung gestellt werden (z.B. AddEnemy() um einen Gegner zu erstellen, DestroyEnemy() um einen Gegner zu zerstören etc.)

Ich dachte natürlich zuerst an LUA und habe erfreut festgestellt, dass es mit z.B. Luabind auch gute C++-Unterstützung gibt.

Aber leider scheint micht die Doku etwas zu verwirren.

Zum Beispiel verstehe ich nicht, was diese Module sollen:

C-/C++-Quelltext

1
2
3
4
module(L)
[
    def("greet", &greet)
];



Allgemein wären ein paar Tipps (vielleicht sogar Code-Beispiel) hilfreich, wie ich Lua bzw. Luabind für meine Zwecke optimal nutzen könnte. Also wie kann ich einen bestimmten Teil des Scripts (die "Hauptschleife" im Script sozusagen) bei jedem Durchlaf der wirklichen Spielschleife ausführen, Memberfunktionen (z.B. AddPlayer() oder sowas) von meiner Game-Klasse als normale Funktionen in Lua zur Verfügung stellen...?


Ich würde mich über Denkansätze, Codeeispiele, Tipps, Links und weitere Hilfe zum Einstieg in lua und Luabind wirklich freuen!

FBI

dbGAMES

Treue Seele

Beiträge: 323

Wohnort: Frankfurt

Beruf: Student

  • Private Nachricht senden

2

06.07.2007, 11:18

hier http://www.nuclex.org/articles/quick-introduction-to-luabind findest du ein schönes einsteiger tutorial.

FBI

Frischling

  • »FBI« ist der Autor dieses Themas
  • Private Nachricht senden

3

06.07.2007, 13:07

Danke für den Link

Das ist auf jeden Fall schonmal verständlicher als die offizielle Doku. Danke :)


Ich habe jetzt zunächst noch eine Frage: Werden die Memberfunktionen einer Klasse so wie normale Funktionen auch übergeben? Wenn ich mich in der Run()-Methode der Game-Klasse befinde und dort eine Funktion der eigenen Klasse aufrufe, so geschieht das ja auch wie bei ganz normalen Funktionen.
Kann ich, solange ich mich in einer Methode der jeweiligen Klasse befinde, die Funktionen dieser Klasse auch so an Lua übergeben, wie normale Funktionen?

Also mein Konzept ist das folgende:
Für jede Funktion (wie z.B. AddPlayer(string name), DestroyPlayer() etc.) die ich im Lua-Script definiere, definiere ich auch eine Memberfunktion in der Game-Klasse. So will ich erreichen, dass wenn also der LUA-Befehl "AddPlayer(string name)" ausgeführt wird, dass dann die Memberfunktion "AddPlayer(std::string name)" der Game-Klasse ausgeführt wird.
Andersherum soll es Memberfunktionen geben, die wiederum Funkionen in LUA aufrufen. Falls also ein Gegner getötet wurde, dann wird von der Run-Methode der Game-Klasse die Memberfunktion "EventPlayerDestroyed(int player_id) aufgerufen. Diese Funktion soll dann wiederum die LUA-Funktion EventPlayerDestroyed(...) aufrufen.
Ist das so sinnvoll? Oder sollte ich das nochmal überdenken?

Danke :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

06.07.2007, 13:54

Soweit ich weiß erlaubt LUA nur normale Funktionen.
@D13_Dreinig

FBI

Frischling

  • »FBI« ist der Autor dieses Themas
  • Private Nachricht senden

5

06.07.2007, 14:10

Naja, es geht ja auch um Luabind...
Dass Lua selbst nur normale Funktionen beherrscht, weiß ich.

Aber ich suche ja eine Möglichkeit, eine Memberfunktion mittels Luabind mit Lua zu verbinden, sodass sie von Lua als ganz normale Funktion behandelt wiurd.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

06.07.2007, 14:12

In der Doku steht doch was darüber: http://www.rasterbar.com/products/luabind/docs.html#binding-classes-to-lua

Edit:
http://www.nuclex.org/articles/quick-introduction-to-luabind <- Hier stehts übrigens auch... :roll:
@D13_Dreinig

FBI

Frischling

  • »FBI« ist der Autor dieses Themas
  • Private Nachricht senden

7

06.07.2007, 20:44

ja, aber ich möchte ja keine Klassen exportieren, sondern nur die Memberfunktionen und zwar so, dass man sie in Lua wie eine ganz normale Funktion aufrufen kann.

Im Beispiel wird das ja folgendermaßen gemacht:

Quellcode

1
MyResourceManager:loadResource("xyz.res")


Ich möchte das Objekt aber nicht nach Lua exportieren, sondern ich möchte, dass Lua seine Memberfunktionen wie ganz normale Funktionen behandelt. Von der Game-Klasse ist ja nur eine Instanz vorhanden.

Nach dem Beispiel oben möchte ich also nicht "MyResourceManager:loadResource("xyz.res")" schreiben müssen, sondern nur "loadResource("xyz.res")".

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

06.07.2007, 20:58

Und woher soll der Aufrufer (LUA) wissen welches Objekt für den Aufruf verwendet werden soll?
Dann nimm Callbacks für jede deiner Methoden.
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

06.07.2007, 21:27

wenn es nur ein Gameinstanz gibt (Singleton?), kann man ja einfach eine Funktion nehmen, die folgendes macht

void loadResource(char* str)
{
Game->loadResource(str);
}

;)
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.

Werbeanzeige