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

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

1

16.04.2011, 17:17

[C++ / LUA] C++ Funktionen für LUA zugänglich machen

Ich beschäftige mich in letzter Zeit wieder etwas mit C++ und wollte auch mal mit LUA
rumexperimentieren. Ich habe es auch schon eingebunden. Ich verwende die Windows Binaries
der Version 5.1. Meine Idee ist jetzt, wie es schon viele Spiele vorgemacht haben, das Grundgerüst
in C++ zu programmieren, und dinge wie KI, Steuerung, Maps laden, etc. dann in Lua.
Aber wie kann ich z.B. public Funktionen für Lua Skripte zugänglich machen, bzw. wie
kann ich in LUA Skripts sowas machen:

C-/C++-Quelltext

1
2
if (App.GetInput().isKeyDown(sf::Key::Up))
    player.MoveUp();

???

Ich würde mich wirklich sehr freuen, wenn mir hier jemand weiterhelfen kann,
weil mir die Sache mit LUA schon lange im Kopf rumgeistert, ich aber beim
Google'n auch nichts brauchbares gestoßen bin...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

16.04.2011, 17:23

Ggf helfen Anwendungsbeispiele: http://networklibsbenc.svn.sourceforge.n…ain/LuaBind.cpp . Falls du fragen hast, frag.

EDIT: achso sowas wie mit dem player.move wird schwieriger, da LUA kein OO von sichaus kennt und man das erst mit den LUA tables einbauen muss. Damit habe ich mich aber nie beschäftigt. Ich nutze mittlerweile eher python.
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.

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

3

16.04.2011, 17:28

Du benutzt Python, wie im Tutorial "Python mit boost" (oder so änlich)?
Aber ist Python nicht mindestens 10mb groß, wenn du dein Programm verteilst?
die lua dlls sind nichtmal 200kb groß...

Kann man das, was ich oben angesprochen habe, mit python machen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

16.04.2011, 18:58

Also LUA ist natürlich kleiner und (angeblich) oft schneller. Dafür ist vieles mit Python deutlich kompakter zu programmieren und python ist deutlich mächtiger.
Für eines meiner aktuellen Projekte (Schleichfahrt remake) nutze ich Panda3d, welches eine Spielebibliothek ist, die von python aus genutzt werden kann. Die Bestandteile im Spiel die in Python zu langsam sind lagere ich dann als C++ Modul aus, was dank boost.python schnell gemacht ist, wenn man den Abschnitt erstmal in C++ übersetzt hat. Für das networklibsbenc nutze ich LUA, weil ich das zuerst getestet habe und LUA für kleine "Konfigurationskripte" etc. durchaus seinen Charm hat. Bekannte Spiele nutzen ja LUA auch durchaus für "komplexere" Abschnitte, wobei ich vermute, dass dann LUA doch recht schnell "unhandlich" wird. Mit Sicherheit kann es dir aber nur jemand sagen, der LUA auch für OO-lastigere Teile genutzt hat.
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.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

17.04.2011, 03:07

Also ich habe kürzlich mit Hilfe von Luabind mal ein bisschen mit Lua herumgespielt und muss sagen, dass ich egtl. sehr positiv überrascht war. Mit Luabind ist auch das verfügbar machen von Klassen kein großes Problem und man kann sie, wenn man sich ein bisschen an des Syntax gewöhnt(object.variable bzw. object:function()), auch sehr gut verwenden. Allerdings habe ich bisher auch nicht sonderlich aufwendige Sachen gemacht. Aber das, was ich bisher gemacht habe, hat mir recht gut gefallen ;)

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

6

17.04.2011, 10:14

Luabind ist ja auch ein Klon von Boost.Pyhton:

Zitat von »http://www.rasterbar.com/products/luabind/docs.html#acknowledgments«

This library was highly inspired by Dave Abrahams' Boost.Python library.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

17.04.2011, 10:31

Ist ja fast ein 1:1 Pendant. Was mir auf den ersten Blick allerdings fehlt sind die Anbindungen für die STL Standardklassen. Am nächsten kommt noch die Anbindung von Iteratoren, wobei ich sowas ja eher unschicklich finde:

C-/C++-Quelltext

1
2
3
4
for (iterator i(globals(L)["a"]), end; i != end; ++i)
{
  *i = 1;
}

Python löst es ein wenig "schicker", dürfte aber ggf. auch langsamer sein:

Quellcode

1
2
for entry in a:
   entry = 1

Aber da hört halt der objektive Vergleich auf und die eigenen Präferenzen spielen die erste Geige.

EDIT: Teilkorrektur; es gibt also schon ein return_stl_iterator, aber wenn ich das richtig sehe ist diese Anbindung dennoch nicht ganz so mächtig (gibt es dict bzw. std::map ähnliche objekte in LUA?).
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.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

8

17.04.2011, 11:30

Du kannst die STL recht einfach in LUA mit Luabind verfügbar machen. Wie jede andere Klasse auch.
Beispiel:

C-/C++-Quelltext

1
2
3
4
luabind::class_<std::vector<std::string>>("string_vector")
            .def("empty", &std::vector<std::string>::empty )
                        .def("push_back", &std::vector<std::string>::push_back )
                        // Und immer so weiter

Und dann kannst du diese STL-Objekt mit den registrierten Funktionen in einem Lua-Script nutzen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

17.04.2011, 12:16

schon schon, das sah ich bereits aber in python sind die std::vector z.b. direkt als python list verfügbar. Sprich auch sowas wie vectorobject[index] funktioniert und soweit ich weiß ist eine std::map direkt als python dict angebunden. Man muss also weder die bindings selbst schreiben, noch unterscheiden sich die c++ objekte von den python objekten in ihrer Nutzung.
Es sind natürlich Kleinigkeiten und im Vergleich zu "plain" C-API sind solche Bindings eine echte Vereinfachung. Auf Grund ihrer Ähnlichkeit würde sich somit auf C++ Seite nur kleine Unterschiede ergeben. Sprich es bleibt nur die Frage, welche Sprache man eher präferiert.
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