Ich möchte ein modifizierbares Spiel machen. Wie wirkt sich das auf meine Wahl der Programmiersprache aus? [geschlossen]


26

Ich habe angefangen, einige kleine Spiele in Java zu machen, und ich denke darüber nach, C # für ein größeres Projekt zu lernen. Ich würde sehr gerne ein modifizierbares Spiel machen, aber jemand sagte mir, dass ich mich an Java halten muss, wenn ich möchte, dass das Spiel modifizierbar ist, obwohl ich nicht verstehe, warum.

Welche Eigenschaften der Programmiersprache machen eine Sprache besser für modifizierbare Spiele geeignet?


3
Wenn Sie ein modifizierbar Spiel machen wollen, PhysicsFS könnte eine sehr nützliche Bibliothek zu kennen sein. (Es hat nichts mit Physik zu tun, lassen Sie sich nicht vom Namen täuschen. :))
Paul Manta

10
"Aber jemand hat mir gesagt, dass ich mich an Java halten muss, wenn ich will, dass das Spiel modifizierbar ist." Das ist übrigens BS.
Ray Dey

Antworten:


18

Es hängt davon ab, wie Sie Ihr Mod-System entwerfen möchten. Ich werde zwei davon untersuchen.

SDK

Höchstwahrscheinlich werden Sie verlangen, dass Ihre Modder dieselbe Sprache wie Sie verwenden und Mods über Reflection laden (oder ähnlich, abhängig von der Sprache Ihrer Wahl). Dies wird Sie offensichtlich auf Sprachen beschränken, die späte Bindungen ausführen können - und es gibt viele, die dies ausführen können (sogar C kann späte Bindungen mit einigen cleveren LoadLibraryTricks ausführen). Du könntest sogar Meta-Modding machen, wobei ein Mod andere Mods hosten könnte (zB gescriptete Mods).

Das erste Problem bei diesem Ansatz ist das Verbergen des internen Zustands. Wenn ein Modder beispielsweise C # verwendet, um auf private Mitglieder zuzugreifen, kann er dies auch tun (obwohl mehr Aufwand erforderlich ist).

Das zweite Problem ist das Hosting. Die Leute mögen es nicht wirklich, wenn auf ihrem System fremder Code ohne Sandbox ausgeführt wird. Als Worst-Case-Szenario könnten Sie einen Mod schreiben, der eine Seedbox aufbaut. Wenn dies bei einem ISP installiert wird, kann dies zu ernsthaften Reputationsschäden führen.

Scripting

Modder würden eine Sprache wie Lua verwenden, um Mods zu erstellen. Sie würden entweder eine Sprache benötigen, die nativen Code aufrufen könnte (um mit Lua zu kommunizieren); oder Sie müssten Ihre eigene Skriptsprache in der Sprache Ihrer Wahl schreiben.

Das erste Problem hierbei ist, dass die meisten Skriptsprachen interpretiert werden, was für Echtzeitsysteme möglicherweise nicht akzeptabel ist (siehe jedoch LuaJIT). wie Spiele.

Ironischerweise besteht hier immer noch das zweite Problem. Lua als Beispiel war ich extrem enttäuscht , dass ist , hat ‚Beschuss-out‘ -Funktionen im Kern / Standardbibliothek enthalten - so dass es als eine Sandbox - Umgebung (ohne großen Aufwand, Glück und Wartung) völlig nutzlos, es ist schwer zu Stellen Sie dar, wie wütend ich darüber bin, aber ich hoffe wirklich, dass sie einige starke Cocktails tranken, als sie diese Anti-Features enthielten . Sie könnten dies offensichtlich leicht vermeiden, wenn Sie Ihre eigene Sprache rollen würden (siehe: UnrealScript).

Schließlich können die Kosten für die Interaktion mit einer Skript-Engine unerschwinglich sein. Dies ist beispielsweise Lua in Kombination mit C #: C # hat einen erheblichen Overhead beim Aufrufen nativer Funktionen (über P / Invoke), und Lua ist eine recht gesprächige API. Dies kann zu Problemen führen, wenn die Art und Weise, in der Sie das 'Skript-SDK' entwerfen, viel Chatten zwischen Ihrer Primärsprache und Ihrer Skriptsprache erfordert (beachten Sie, dass C dieses Problem nicht wirklich hat). Wiederum können Sie dem ausweichen, indem Sie Ihre eigene Skriptsprache schreiben (und sie im Fall von C # in MSIL kompilieren) und sie auf schnellste Weise in Ihrer [virtuellen] Umgebung ausführen.

Da das Skript im Wesentlichen auf einem anderen System ausgeführt wird als Ihr Primärcode, können Sie den Zugriff auf den internen Status vollständig steuern (es sei denn, sie führen einige ausgefallene Aktionen mit den zuvor genannten Shell-Funktionen aus).

Fazit

Ich habe ein wenig vom Thema abgewichen , aber man kann im Grunde genommen aus dieser Textwand lernen, dass man in der Lage sein sollte, ein modifizierbares Spiel in jeder Sprache zu erstellen (ich würde sagen, dass man das kann ) - aber in einigen Sprachen kann zu mehr Arbeit führen. Bin ich ein bisschen anal in Bezug auf Sicherheit? Ja, Sie sollten es auch sein, wenn es um Benutzercode geht.


In dem ersten Szenario, das Sie beschrieben haben, geht es darum, dass der Benutzer seine eigene dynamische Bibliothek programmiert und in das Spiel einbindet. Ich habe dies schon in Bibliotheken gesehen (z. B. in Audiobibliotheken, um neue Codecs hinzuzufügen usw.), aber möglicherweise, weil ich mich noch nie zu sehr mit Modding befasst habe, bin ich noch nie auf einen solchen Fall für ein Spiel gestoßen. Ich bin neugierig darauf (da es für den Benutzer sehr schwierig zu sein scheint, dies zu tun, und ich sehe Mods normalerweise als zugänglich an), kennen Sie also ein Beispiel? Die meiste Zeit sehe ich spezialisierte Tools, wie zum Beispiel World-Editoren mit ein bisschen Skripting.
David Gouveia

1
@DavidGouveia Ich glaube, dass mindestens eine Version der für Europa Universalis verwendeten Paradox-Engine (und gleichwertige Spiele für verschiedene Zeiträume) eine Form von Binär-Patching unterstützt hat (obwohl dies möglicherweise dadurch geschehen ist, dass der Modder-Patch die Quelle des Modder-Patches ist und eines davon neu kompiliert die Spiele-DLLs (anstatt über die richtige SDK-Unterstützung zu verfügen) zusätzlich zu den am häufigsten verwendeten Mods durch Ändern einer Datendatei-Implementierung.
Dan Neely

2
@ DavidGouveia sehen: Quellmaschine; oder sogar Winamp-Plugins. Ich denke Quake funktioniert sogar so. Ich habe festgestellt, dass Sie C # verwenden. Vielleicht möchten Sie sich also mit MEF (Managed Extensibility Framework) befassen: Legen Sie eine Schnittstelle offen, laden Sie sie über Reflection hoch, und begeben Sie sich zu Ihrem Onkel.
Jonathan Dickinson

@ Jonathan Dickinson Oh, ich hatte keine Ahnung, dass die Source Engine unter diesem Modell lief. Stellt euch immer eine Reihe von Werkzeugen wie das The Elder's Scrolls Construction Set vor. Vielen Dank für die Info (ich hatte eine Idee, wie es funktioniert, dachte nur, es wäre zu kompliziert für den allgemeinen Modder). Und ich habe wirklich gelacht über die "Rolle deines Onkels" . :-)
David Gouveia

1
Zu Lua: Diese Leute haben eine Sandbox-Lua, die für die Verwendung in Wiki-Software geeignet ist (und stabil genug ist, dass die englische Wikipedia sie verwendet). Ich bin mir sicher, dass Sie es an Ihre Bedürfnisse anpassen können, aber einige Teile der Erweiterung sind GPL-geschützt. Wenden Sie sich daher an Ihren Anwalt.
Kevin

16

Ich würde sagen, die Sprache ist hier kein entscheidender Faktor. Es ist wirklich nur, wie flexibel und datengetrieben Sie Ihr Spiel gestalten, das es definiert.

Jedes Spiel wird mit einer Reihe von Daten ausgeführt (z. B. alles von Levels, Maschen, Konfigurationen, Gegenständen). Der Unterschied zwischen einem normalen Spiel und einem modifizierbaren Spiel besteht darin, dass das spätere Tool dem Benutzer ermöglicht, vorhandene Daten zu ändern (oder eigene Daten hinzuzufügen). Egal für welche Sprache Sie sich entscheiden, versuchen Sie einfach, Ihr Spiel so datengesteuert wie möglich zu gestalten, und vermeiden Sie das Hardcodieren von Spielinhalten. Praktisch jede Sprache, für die Sie sich wahrscheinlich entscheiden, kann Daten von der Festplatte lesen, was das meiste ist, was Sie brauchen.

Es ist auch auf halbem Weg, wenn Sie die Tools nur für Ihren eigenen persönlichen Gebrauch erstellen (zum Beispiel Ihren eigenen Level-Editor) und sie später perfektionieren und mit Ihren Benutzern teilen. Der Super Meat Boy Level Editor war so ziemlich das, eine verbesserte Version des Tools, das während der Entwicklung des Spiels verwendet wurde.

Abhängig von der Art des Spiels möchten Sie den Benutzern möglicherweise erlauben, einen Teil des Spielverhaltens zu skripten. In diesem Fall sollten Sie schon früh eine Skriptsprache in Ihr Spiel integrieren (entweder Ihre eigene oder eine vorhandene wie Lua oder Python, die beliebte Wahlmöglichkeiten sind). Dies fällt auch in die Kategorie des datengetriebenen Designs. Wenn Sie sich für die Verwendung einer vorhandenen Skriptsprache entscheiden, sollten Sie möglicherweise überprüfen, ob die Programmiersprache Ihrer Wahl über Bindungen für diese Skriptsprache verfügt (in der Regel in Form von Bibliotheken von Drittanbietern).


5

Die Sprache, die Sie auswählen, bestimmt nicht wirklich, wie veränderlich ein Spiel ist, und die Art und Weise, wie Sie die Sprache verwenden, ist wichtiger.

Wenn der Großteil Ihres Spiels datengesteuert ist (das heißt, die Spieldaten sind in einer Datei definiert, die aus Ihrem Code gelesen wird), kann das Spiel sehr modifizierbar sein. Dies kann in so ziemlich jeder Sprache erfolgen. Die Verwendung einer Skriptsprache erleichtert auch das Modifizieren eines Spiels.

Dies bedeutet jedoch nicht automatisch, dass es unmöglich ist, ein Spiel zu modifizieren, wenn Sie diese Dinge nicht verwenden. Minecraft zum Beispiel ist überhaupt kein sehr modifizierbares Spiel, es gibt jedoch ziemlich gute Dekompilierer für Java und eine sehr große Community für Minecraft, so dass eine Menge Werkzeuge entwickelt wurden, um Minecraft modifizierbar zu machen (verschiedene Modloader, Bukkit). Mit diesen Tools ist es möglich, Minecraft zu modifizieren (allerdings sind sie in einigen Ländern wahrscheinlich technisch illegal).

Der beste Rat, den ich Ihnen geben kann, ist, die Tools zu verwenden, die Modder verwenden sollen. Wenn Sie einen NPC aus einer Datei definieren, kann dieser modifiziert werden. Wenn Sie einen speziellen Code angeben, kann dies wahrscheinlich nicht der Fall sein.


1

Java ist perfekt zum Schreiben eines modifizierbaren Spiels geeignet.

Der beste Weg, um ein Spiel modifizierbar zu machen, ist normalerweise, eine dynamische Sprache zu verwenden, die in die breitere Anwendung eingebettet und für die Skripterstellung verwendet werden kann. In der Regel möchten Sie eine dynamische Sprache, da der Punkt darin besteht, zur Laufzeit mit dem Code interagieren zu können, ohne einen vollständigen Kompilierungs- / Build- / Testzyklus durchlaufen zu müssen.

Einige zu berücksichtigende dynamische Sprachoptionen:

  • Groovy - eine exzellente dynamische Java-ähnliche Sprache, die in größere Java-Programme eingebettet werden kann.
  • Clojure - ein mächtiges, dynamisches Lisp für die JVM. Es mag für einige Modder schwierig sein, sich zurechtzufinden, ist aber eine außergewöhnlich mächtige Sprache und kann sehr einfach eingebettet werden. Habe es noch nicht gesehen, aber keinen Grund, warum nicht.
  • Lua - eine sehr beliebte Skriptsprache für Spiele. Ich glaube, es gibt Versionen für die JVM, die Sie in Java verwenden können (obwohl ich diese selbst nicht ausprobiert habe).
  • JavaScript - verfügbar auf der JVM über Rhino . Eine ziemlich solide Wahl für Spiele-Skripte, da viele Leute etwas JavaScript kennen und das Prototyp-Objektmodell sehr gut zu Spielmods passt.

-2

Es gibt einen einfacheren Weg, dies in Java zu tun, obwohl es ein bisschen schlampig ist. Alles, was Sie tun müssen, ist, die Punkt-Java-Dateien in einem Ordner zu speichern und diese Batch-Datei mit dem Ordner zu versehen. Nennen Sie ihn Ausführen:

javac /src/.java Java / src /

Hinweis: Sie können beliebig viele Klassen hinzufügen. Hinweis: Stellen Sie in der letzten Zeile sicher, dass KEINE Erweiterungen (.java, .exe, .bat, ect.) Vorhanden sind.

Das kompiliert den Code einfach jedes Mal neu, wenn das Spiel ausgeführt wird. Wenn also die Spielquelle geändert wird, wird er kompiliert und dann das neu kompilierte Spiel ausgeführt. Leider können Sie die Mods anderer Leute nicht zum Spiel hinzufügen.


Jacob Ich glaube nicht, dass Sie die Frage verstanden haben. Lesen Sie bitte die Antworten durch und sehen Sie, ob das Ihnen hilft, zu verstehen, was hier diskutiert wurde.
Vikki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.