Wie fügt man einem Spiel eine Skriptsprache hinzu?

25

Nehmen wir an, ich habe ein Spiel in C ++ geschrieben. Aber ich möchte einige Modding- oder Scripting-Funktionen hinzufügen. Wie würden Sie Ihrem Spiel eine Skriptfunktion hinzufügen?

Ólafur Waage
quelle
Die beliebteste Sprache: Siehe Lua (Programmiersprache) und Lua (Programmiersprache) - C API Beispiel: IBM hat einen großartigen Artikel dazu: Einbetten von LUA
Tamara Wijsman
Die genauen Schritte hängen stark von der Sprache ab, die Sie hinzufügen möchten. Werfen Sie einen Blick auf gamedev.stackexchange.com/questions/11/...
tenpn

Antworten:

27

Zunächst sollten Sie entscheiden, welcher Teil Ihres Spiels als Skript ausgeführt wird. Eine Option ist ein vollständig skriptgesteuertes Spiel in dem Sinne, dass die zeitkritischen Backend-Operationen in C ++ kodiert sind, die gesamte Spielelogik jedoch in der Skriptsprache vorliegt. Designer verwenden das Backend als API, das von der Skriptsprache auf hoher Ebene aufgerufen wird. Auf der anderen Seite kann es nur wenige Stellen geben, an denen Skripte verwendet werden, wie z. B. die Benutzeroberfläche oder Skriptsequenzen. Der Großteil des Spielcodes befindet sich noch in C ++. Jeder Ansatz bietet Vorteile (Geschwindigkeit, Flexibilität, Kompilierungszeit, Umfang des Spiels usw.), dies muss jedoch im Voraus festgelegt werden.

Wenn Sie wissen, wie Sie Skripte verwenden möchten, müssen Sie sich jetzt entscheiden, ob Sie eine vorhandene Skriptsprache oder Ihre eigene domänenspezifische Sprache verwenden möchten . Heutzutage stehen viele Skriptsprachen mit unterschiedlichen Designzielen und Zielgruppen zur Auswahl. Daher bin ich mir nicht sicher, ob es sich lohnt, eine eigene zu erstellen. Wenn Sie sich dazu entschließen, Ihre eigenen zu implementieren, finden Sie hier einige Ressourcen:

Lua ist eine beliebte leichtgewichtige und einfach einzubettende Skriptsprache. Es verwendet einen Stack für die Kommunikation zwischen dem Host und der eingebetteten Sprache und wurde erfolgreich in vielen professionellen Spielen eingesetzt . Sol2 vereinfacht das Binden von Lua und C ++. Wenn Sie die Syntax von Lua nicht mögen, ist Moonscript eine Sprache, die zu Lua kompiliert wird und eine schöne Reihe von Funktionen hinzufügt.

Weitere Optionen sind AngelCode , mit dem Sie C- und C ++ - Funktionen direkt aufrufen können. Python und Ruby sind etwas komplexer in der Einbettung, aber sehr angenehm zu programmieren. Wenn Sie Python einbetten möchten, schauen Sie sich Boost.Python an . Eine andere Idee ist die Einbettung von JavaScript, um die für Browser entwickelten schnellen Scripting-Engines zu nutzen (siehe V8 und SpiderMonkey ).

Firas Assaad
quelle
2
Ich habe eine Skriptsprache für mein aktuelles Spielprojekt implementiert und der Hauptvorteil ist die vollständige Kontrolle über Sprachprimitive. Vorkonfigurierte Skriptlösungen sind generisch und Sie benötigen möglicherweise nicht alle Funktionen, die sie bereitstellen. Sie sollten auf keinen Fall darüber nachdenken, Ihre eigene Sprache zu verwenden, es sei denn, Sie sind sicher, dass Sie etwas entwickeln können, das für Ihr Spiel besser ist als eine vorhandene Lösung.
Jon Purdy
Persönlich mag ich Guile , es hat eine großartige Integration mit C. Das einzige Problem ist die Geschwindigkeit, aber mit der Version 2.0 in den nächsten paar Monaten sollte sich das auch verbessern.
Joe D
Hervorragende Antwort. Der erste Absatz kann zusammengefasst werden als "Spieleentwickler erstellen eine API, die für den Inhalt verwendet wird."
ashes999
Der Oberbegriff für benutzerdefinierte Sprachen (Scripting oder auf andere Weise) ist DSL. Dies kann hilfreich sein, wenn Sie wissen möchten, ob Sie etwas nachlesen möchten.
Patrick Hughes
2

Ich schrieb einen Beitrag über GameMonkey Skript zu einem Spiel Einbettung mit Dragon SDK hier .

Grundsätzlich besteht die Idee darin, Ihre C \ C ++ - Funktionen für die von Ihnen gewählte Skriptsprache verfügbar zu machen und sie in Ihrem Skript zu verwenden. In meinem Tutorial habe ich zwei Funktionen aus DragonFire SDK verfügbar gemacht. Beim Spielstart rufe ich die onStart-Funktion vom Skript aus auf und beim Aktualisieren rufe ich die onTimer-Funktion vom Skript aus auf.

Hoffentlich hilft das!

astk
quelle
1
Ich habe hier auch eine Videodemo
astk