Wie die meisten von Ihnen wissen, werden eingebettete Interpreter für Sprachen wie Lua und Python häufig für die Erstellung von Spielelogik verwendet, aber ich habe nicht viele Informationen darüber erhalten, wie Leute für ihre Skripte domänenspezifische Sprachen verwenden, z 'zusätzlich zu der Sprache, die für den Rest des Spiels verwendet wird, mit Makros oder flüssiger Programmierung oder so weiter.
Meine Fragen lauten also wie folgt:
- Welche Beispiele für solche DSLs haben Sie in realen Spielen gesehen?
- Auf welche Probleme wurde gestoßen?
- Würden Sie diese Route anderen Spieleentwicklern empfehlen und unter welchen Umständen?
- Sehen Sie, dass dies immer häufiger vorkommt, wenn sich die Spieleentwicklung zu metaprogrammierfreundlicheren Sprachen entwickelt, z. B. Boo?
Antworten:
Mein Rat wäre "nicht".
Ich habe eine domänenspezifische Auszeichnungssprache für Spieldaten verwendet. Es war ein Schmerz. Ich habe Tage damit verbracht, es zu entwerfen, und dann musste ich jede oder jede zweite Woche daran arbeiten, um weitere Funktionen hinzuzufügen. Irgendwann wurde mir klar, dass ich einige meiner Spieldaten automatisch generieren musste, und schließlich schrieb ich ein kleines Programm, um Eingabedateien in der Auszeichnungssprache zu analysieren, sie zu massieren und verschiedene Dateien auch in der Auszeichnungssprache auszugeben.
Ich habe ehrlich gesagt keine Ahnung, was ich dachte. Das Ganze wäre einfacher, effizienter, weniger fehleranfällig und weitaus weniger zeitaufwändig gewesen, wenn ich nur Lua verwendet hätte.
Wenn Sie auf einem so eingeschränkten System arbeiten, dass Sie eine Lua-Umgebung nicht starten können, sollten Sie vielleicht ein DSL verwenden, aber auf Qual vorbereitet sein. Ansonsten glaube ich fest daran, dass Sie einfach Lua verwenden sollten. Lua wurde ursprünglich als einfache Datenauszeichnungssprache entwickelt und eignet sich immer noch hervorragend für die Verwendung als solche. Wenn (nicht, wenn) Sie feststellen, dass Sie etwas Komplizierteres benötigen, haben Sie es bereits. Alle meine aktuellen Spieleentwicklungen wurden in Lua durchgeführt und ich war noch nie effizienter oder weniger fehleranfällig.
Ich kann gegen DSLs nicht stark genug empfehlen.
quelle
Skriptsprachen sind in Spielen in der Regel eine teure Angelegenheit. Sogar Lua, das ziemlich schnell ist, ist immer noch sehr viel langsamer als nativer Code. Spielteams sind in der Regel nur bereit, diesen Treffer zu erzielen, da dies ihnen zwei sehr große Vorteile bringt:
DSLs geben dir das leider nicht.
quelle
Ich finde es merkwürdig, dass sich Ihre Frage auf beschränkt interne DSLs beschränkt, da ich lieber die Verwendung eines externen DSL befürworten würde , um Skripte zur Laufzeit laden zu können und insbesondere Nicht-Entwicklern zu ermöglichen, Spielelogik in das DSL zu schreiben .
Zum Beispiel verwendet mein aktuelles Projekt ein (für den Moment) einfaches externes DSL, um einen Teil der Spielelogik zu spezifizieren, der es Spieldesignern ermöglicht, Balancetests größtenteils ohne Entwicklerintervention durchzuführen.
Natürlich müssen Sie einen Parser schreiben. Zu diesem Zweck ist meines Erachtens das am meisten empfohlene Tool ANTLR, das sich an einige Sprachen richtet . Obwohl wir bei meinem Projekt den Parser Combinator-Weg mit jParsec gegangen sind (unser Backend ist Java, es gibt Varianten in anderen Sprachen), ist das für seine enge Beziehung zu BNF ganz nett, aber vielleicht weniger gut dokumentiert.
quelle
Mein Rat wäre: Tu !
Aber nur, wenn Sie eine Verwendung dafür haben.
Sie müssen kein DSL erstellen, wenn Sie es nur intern verwenden möchten.
Galaxy ist die Skriptsprache, die der Startcraft II-Editor verwendet. Es ist ein Paradebeispiel für eine domänenspezifische Sprache.
Es richtet sich eher an Spieleentwickler als an Programmierer:
Beispiel-Tutorial
Lisp ist die perfekte Sprache, um domänenspezifische Sprachen zu erstellen, aber es gibt natürlich auch andere Optionen. Wie Boo.
Auf diese Weise müssen Ihre Designer / Modder das Programmieren nicht lernen, auch wenn es nur Lua ist, es programmiert immer noch.
Bearbeiten: Lassen Sie mich hinzufügen, dass ein DSL in einer Skriptsprache implementiert werden kann - es ist nicht gleichbedeutend mit dem Nichtverwenden einer Skriptsprache. Vor allem, wenn Sie Lisp oder ähnliches verwenden, da es sich hervorragend zum Erstellen domänenspezifischer Sprachen eignet.
quelle
Interne dsls sind nur syntaktischer Zucker auf einer guten API. Die API ist das Wichtigste. Nachdem Sie eine gute API haben, ist das Erstellen einer dsl trivial und nicht so wichtig.
quelle
UnrealScript ist wohl ein DSL. Es scheint die Aufgabe zu erledigen, obwohl ich denke, dass es möglich ist, Spieleskriptsprachen noch "domänenspezifischer" zu gestalten. Ich würde empfehlen, ein DSL zu erstellen, wenn es für die Domain etwas gibt, das von Sprachänderungen profitiert. Ich habe ein paar Ideen in diesem Bereich, aber noch keine vollständigen Informationen.
Ich denke nicht, dass eine ziemlich neue Engine, die eine Sprache unterstützt, ein Beweis dafür ist, dass sich die Spieleentwicklung in eine bestimmte Richtung bewegt. Es ist noch früh.
quelle
Wenn Sie wirklich eine Allzweck-Programmiersprache benötigen, ist das Rollern Ihrer eigenen mit ziemlicher Sicherheit ein Fehler. Wenn Ihre Sprache Variablen, Ausdrucksauswertung, Schleifen, Bedingungen, Klassen, Funktionen usw. benötigt, sollten Sie sich am besten an eine bekannte Sprache wie Lua, Lisp, Python, JavaScript usw. halten.
Wenn es jedoch hauptsächlich darum geht, Daten zu definieren, ist vielleicht eher deklarativ als imperativ; definiert vielleicht Zustände und Regeln (wie GDL); und braucht nicht das meiste was eine GP sprache gut kann, dann überlege eine DSL.
Aber Vorsicht: Das Erstellen von Sprachen und Compilern kann sehr schwierig sein, und Vorkenntnisse sind eine große Hilfe. Ich würde einen PEG-Parser (selbst ein DSL) empfehlen, der auf einer EBNF-Grammatik (einem anderen DSL) basiert, und wenn das eine zu große Frage ist, sollten Sie es besser nicht versuchen.
quelle