Multiplayer Online Game Engine / Pipeline

7

Ich implementiere ein Online-Multiplayer-Spiel, bei dem der Client in AS3 (Flash) geschrieben sein muss, um das Spiel in C ++ in Browser und Server einzubetten (ein abstrakter Teil davon ist bereits geschrieben und wird mit anderen Spielen verwendet).

Netzwerkmodelle können sich voneinander unterscheiden, aber derzeit schaue ich auf die Logik des Spiels, die sowohl auf Client- als auch auf Serverteilen ausgeführt wird, aber sie sind in verschiedenen Sprachen geschrieben, obwohl dies nicht das Hauptproblem ist.

Mein vorheriges Spiel (ziemlich großes - wurde mit den Bemühungen von ~ 5 Programmierern in 1,5 Jahren implementiert) wurde hauptsächlich in elektronischen Tabellen als strukturierte Objekte mit implementierter Vererbung "geschrieben" : Es wurde ein eigenständiges Tool geschrieben, das AS3 und C ++ (Sprachen von Plattformen, für die Plattformen erstellt wurden) generierte Das Spiel wurde veröffentlicht) unter Verwendung einer bestimmten elektronischen Tabellendatei (.xls oder .ods). Diese Datei enthielt ~ 50 Tabellen mit jeweils ~ 50 Zeilen und ~ 50 Spalten und wurde hauptsächlich von Spieledesignern geschrieben, die keine Programmiersprachen kennen. Aber dieses Spiel war Einzelspieler.

Nachdem ich ein Problem mit meinem derzeit implementierten MMO gemeldet habe, schaue ich auf eine riesige Pipeline, in der folgende Probleme gelöst werden können:

  • Beschreibungen der Spielobjekte (welche Raumschiffe im Spiel vorhanden sind, wie viel HP sie haben, wie schnell sie sich bewegen, welchen Schaden sie verursachen ...)

  • Aktionsbeschreibungen (was Spieler oder NPCs tun können: sich gegenseitig angreifen, Ressourcen sammeln, Strukturen aufbauen, sich bewegen, teleportieren, Zauber wirken) - Aktionen werden über den Server zwischen Clients übertragen

  • Einflüsse (was passiert, wenn eine bestimmte Aktion auf ein bestimmtes Objekt angewendet wird, z. B. "Schiff A hat Schiff B angegriffen: Feld" HP "von Schiff B um Feld" Schaden "von Schiff A reduziert"

Einflüsse können viel schwieriger sein, ja, ei "Schaden ist doppelt so groß, wenn das Schiff nachts> = 5 Verbündete in einem Bereich von 200 Einheiten um sich hat" und so weiter. Wenn eine solche Logik in ein "Entwurfsdokument" geschrieben werden kann, ist es leicht möglich:

  • Lassen Sie Designer ihre Arbeit ohne Eingreifen des Programmierers oder fehleranfällige Programmierung erledigen

  • Überprüfen Sie die beschriebene Logik

  • Übertragen (transformieren, konvertieren) in eine beliebige Programmiersprache, in der es ausgeführt wird

Hat jemand an so etwas gearbeitet? Gibt es einige Werkzeuge / Motoren / Pipelines, die sich damit befassen? Wie gehe ich am besten gleichzeitig mit all diesen Problemen um oder stelle ich mir meine Aufgaben und Probleme richtig vor?

Slawisch
quelle

Antworten:

2

Hier gibt es keine Standardwerkzeuge oder -prozesse - jedes Spiel ist anders und jedes Team ist anders, sodass die Erfüllung der Anforderungen von einem zum nächsten unterschiedlich ist. Sie können sich nur ansehen, welche Optionen verfügbar sind, und die für Sie am besten geeigneten auswählen.

Wenn Sie ein benutzerdefiniertes Verhalten wünschen, benötigen Sie eine Skriptsprache. Es gibt kein magisches Werkzeug (das ich kenne), das ein normales Designdokument, auch ein gut geschriebenes, in verwendbaren Spielcode übersetzen könnte, der in der Sprache und Engine Ihrer Wahl funktioniert. Mit einer Skriptsprache können Sie jedoch zumindest externe Dateien so ausführen, als wären sie Code. Auf diese Weise können Benutzer, möglicherweise Designer, Verhalten in der Skriptsprache schreiben, ohne die Hauptspiel-Engine bearbeiten zu müssen. Wahrscheinlich werden Ihre Designer zu diesem Zeitpunkt zu Programmierern, aber hoffentlich ist die Skriptsprache einfacher zu verwenden als C ++ und weniger fehleranfällig, aber vieles davon hängt von Ihrer Wahl der Sprache und der Art und Weise ab, wie Sie sie implementieren.

Skriptsprachen können auch als Datendokumente fungieren, sodass Designer das Verhalten und die Daten in einer Datei kombinieren können. Es ist jedoch häufig effektiver, Daten in einem separaten Tool zu verarbeiten, das Sie selbst erstellen, oder über ein Standardtool wie Excel. Was für Sie am besten ist, hängt von der Art und Menge Ihrer Daten ab.

Kylotan
quelle
Ich bewerte alle MMOs, bei denen die Spielelogik auf Client und Server ähnlich ausgeführt wird, nicht wahr? Wenn ja, warum müssen sie dann anders sein? Überall gibt es Quests, Missionen, Überfälle und so weiter ... (zuvor habe ich versucht, häufigere Begriffe wie Objekte und Einflüsse zu verwenden, aber auch solche Eingeborenen können verwendet werden)
Slawisch
Sie sehen dem Player möglicherweise ähnlich, dem Entwickler jedoch nicht. Computerspiele werden nicht so hergestellt, dass solche austauschbaren Teile möglich sind. Zum Beispiel gibt es keine Standarddefinition für eine "Quest", daher kann es kein Werkzeug zum Entwerfen einer Quest geben, das für alle Spiele geeignet ist.
Kylotan
Nun, ich sehe wirklich keine Hindernisse dafür, dass es solche Tools NICHT geben kann ... Wie ich schon sagte - alle MMOs sind absolut gleich, wenn sie über Serverlogik und ähnliches Gameplay verfügen (also ist EVE zum Beispiel anders als es ist Gameplay) - warum sollten sie alle für jedes Spiel einzeln implementieren? Zum Beispiel haben UT-Engine-Entwickler eine eigenständige Engine mit Unreal-Script entwickelt, bei der es nicht um die Multiplayer-Synchronisation geht - und ich verstehe nicht, warum es keine ähnlichen Tools / Pipelines für MMOs gibt -, dann kann die Erklärung nur eine sein : dass die Entwicklung von MMOs zu modern ist, um sie zu produzieren ...
Slawisch
Technologie ist relativ einfach zu standardisieren. Spieldesign gibt es nicht. Es gibt viele Tools, Bibliotheken und Engines für MMOs, aber keine davon befasst sich mit Gameplay-Entscheidungen, die in verschiedenen Spielen sehr unterschiedlich sind.
Kylotan
Können Sie bitte weitere Details zu Tools, Bibliotheken und Engines angeben?
Slawisch
6

Hier einige Details zu den Gründen für Kylotans Antwort .

Problem Dekonstruktion

Das "Designdokument", an dem Ihre Designer arbeiten, ist effektiv eine Programmiersprache auf hoher Ebene. Sie haben eine High-Level-API (Ihren XLS / ODS-Loader), in die sie ihren "Code" schreiben.

Sie wollen ausdrücken ...

  • Eigenschaften , die festgelegt werden können (z. B. die eines bestimmten Raumschifftyps haben range = 200), die bedingt sein können (z. B. damage = 2*normalDamagewährend der Nacht)
  • Verhalten (z. B. Klicken feuert Laser in Richtung Cursor)

... in irgendeinem Format.

Die Fragen verdichteten sich: Wie sollte dieses Format sein? Wie kann ich es in einer Pipeline zum Laufen bringen?

Antworten

Dafür sind Skriptsprachen gedacht.

Warum? Sie können Eigenschaften in einer Tabelle ausdrücken , aber Sie können kein Verhalten ohne Programmierung ausdrücken .
Warum nicht einfach eine komplexere API schreiben? Stellen Sie sich vor, Sie hätten Folgendes getan: Sie würden die API erweitern, damit Designer bedingte Anweisungen schreiben können. Dann vielleicht Event Callback Funktionen. Und dann würden Sie feststellen, dass Sie eine Skriptsprache implementiert haben.

Glücklicherweise sind Skriptsprachen ( Lua ist sehr beliebt) einfach zu schreiben und leicht mit "schwerem" Code (wie C ++) zu verbinden.

Unter der Annahme von C ++ - Kerncode könnten Sie eine Schnittstelle gamezur Skriptsprache verfügbar machen und die Skriptsprache für Werte und Verhaltensweisen aus dem Kerncode aufrufen, wann immer Sie diese benötigen.

In Lua könnten die obigen Beispiele folgendermaßen ausgedrückt werden:

shipTypes = {
    {
        type = "Assassin",
        range = 200,
        damageDealt = (game.isNight and 1000) or 500,
        actions = {
            leftClick = game.fireAt(pos)
        }
    }
}

Ihre Spieledesigner müssten natürlich die Lua-Grundlagen lernen. (Oder von welcher Skriptsprache Sie auch wählen.)

Anko
quelle
Ich sehe keine Vorteile, die Lua bietet: Alles muss fest codiert sein, keine Überprüfung zur Kompilierungszeit (was das Schlimmste ist: Wenn Sie Thanksgiving Day-Preise programmiert haben, werden Sie wissen, ob Sie nur an diesem Tag Druckfehler gemacht haben). , langsam (schnell, aber viel langsamer als C ++ und benötigt ~ 13 ms, um die leere Funktion innerhalb der Implementierung der virtuellen AS3-Maschine aufzurufen).
Slawisch
Lua ist nur ein beliebtes Beispiel, nicht unbedingt die beste Wahl! Allerdings: Fast jede Skriptsprache wird langsamer als C ++ ausgeführt, und in einer virtuellen AS3-Maschine wird sicherlich alles langsam ausgeführt. Denken Sie auch daran, dass die Überprüfung zur Kompilierungszeit kein Ersatz für Softwaretests ist.
Anko
2

Sie können sich eathena project ansehen , einen mmorpg-Serverklon. Ich habe damit geübt, weil es eine einfache Skriptsprache zum Entwerfen des gesamten Spiels enthält und Sie kostenlose Tools zum Entwerfen der Szenen finden oder sie einfach selbst erstellen können. Es gibt viele Informationen darüber.

Als ich ein Neuling war, schrieb ich einen Reader für einige dieser Dateien wie .gat, die eine Kachelbeschreibung und dergleichen enthielten. Sie können einen Blick auf die Quellen bei Google Code werfen und Screenshots über Tests der Funktionen bei Picasa sehen

Es gibt vielleicht andere kostenlose Quellen für MMO-Server, aber das ist die, die ich am meisten kenne :). Ich hoffe, es hilft.

Pablo Ariel
quelle
Gibt es neben den offiziellen (und illegalen) RO-Optionen noch weitere Optionen für Kunden? Ich würde einen einfachen Open Source (M) MOG-Stack lieben.
drxzcl
@drxzcl: Ich weiß nicht, ich habe meinen eigenen geschrieben, keinen RO-Client, sondern einen Client, der mit einigen RO-Formaten wie Serverpaketen, Kachelbeschreibungen usw. interagieren kann. Außerdem verfügt der von mir erwähnte eA-Server über eine einfache Skriptsprache Das kann jeder und ich glaube, es gibt auch einige Editoren für diese, zum Beispiel habe ich versucht, die Elemente der Shop-NPCs zu konfigurieren, aber es gibt Karteneditoren, Konverter von 3ds Max usw. Es sollte nicht schwer sein, zu codieren ein Kunde dafür, wenn Sie die richtigen Werkzeuge auswählen und etwas Zeit haben oder jemand, der Ihnen hilft.
Pablo Ariel
1

Ich habe in mehreren Spielen mit verschiedenen Teams professionell gearbeitet und ich muss Ihnen sagen, dass Spieledesigner (sie nennen sie hier gerne "Planer") es lieben, Excel zu verwenden, um alle Daten im Spiel zu optimieren. Als Programmierer wären wir Idioten, wenn wir sie nicht benutzen lassen würden.

Mit Excel und einem guten und schnellen Ad-hoc-Excel-zu-Code-Konverter können sie nicht nur ein ihnen bekanntes Tool verwenden, sondern auch Formeln erstellen, Durchschnittswerte, Diagramme überprüfen, Links zu anderen Dateien erstellen usw. Stellen Sie sicher, dass ihre Daten genau so sind, wie sie es möchten.

In der Vergangenheit habe ich beim Erstellen einer neuen Funktion mit optimierbaren Daten ein neues Excel-Buch erstellt. Das erste Blatt enthält die exportierbaren Daten, die eine bestimmte Formatierung haben müssen, damit der Konverter sie eindeutig konvertieren kann. Daher erstelle ich ein Skelett mit einigen Testdaten und erkläre kurz, was geändert werden kann und was nicht. Der Rest der Blätter ist für sie kostenlos.

Der Konverter ist ein einfaches Skript, das in Ruby, Python, C # oder meinem Favoriten erstellt werden kann: VBA. Es nimmt die Daten aus dem exportierbaren Datenblatt und erstellt eine oder mehrere Quelldateien (in C, C ++, Assembly, PHP, SQL, INI oder was auch immer Ihr Spiel versteht), die die erforderlichen Daten als fest codierte Daten und Orte enthalten sie im richtigen Quellordner.

Jedes Mal, wenn eine Änderung vorgenommen wird, führt der Planer den Konverter aus und erstellt das Spiel oder was auch immer sie tun muss (Sie haben einen Ein-Klick-Erstellungsprozess und die Möglichkeit für jedes Teammitglied, eine separate Spielumgebung zu haben, oder?) . Sie kann ihre Änderungen dann sofort auf ihrer Workstation testen, ohne einen Programmierer anrufen zu müssen.

Sobald sie mit ihren Änderungen zufrieden ist, drängt sie sie zur Quellcodeverwaltung, und alle sind glücklich!

Dies ist eine sehr nützliche Methode, mit der Spielplaner Spieldaten ändern können. Da die resultierenden Daten fest codiert sind, können sie in der endgültigen Binärdatei schneller ausgeführt werden.

Selbstverständlich funktioniert dies optimal mit tabellarischen Daten wie Monsterattributen, Zauberparametern, Bühnenkonfiguration und dergleichen. Es ist erwähnenswert, dass Excel-Tabellen besonders nützlich sind, um alle Spieltexte zu speichern, denen jeder danken wird, wenn es Zeit ist, das Spiel in Spanisch, Französisch, Deutsch und 10 andere Sprachen zu übersetzen.

Dies funktioniert jedoch nicht mit skriptfähigen Daten wie Enemy / AI-Verhalten und Menüs. Für diese haben wir in der Vergangenheit eine Reihe grundlegender Bausteine ​​festgelegt (die KI für einen feigen Feind, einen aggressiven Feind, einen Heiler usw.) und sie entweder mit einer anderen Excel-Tabelle versehen lassen oder ihnen grundlegende geben Anweisungen, wie man sie optimiert, um ihre eigenen Zwecke zu erreichen.

Schließlich sehr komplexe Daten, wie die tatsächlichen Ebenen; oder Daten, die tabellarisch sein können, aber nicht einfach zu verstehen sind, indem nur Zahlen angezeigt werden, wie z. B. Positionen von Feinden / Agenten, können weder mit Skripten noch mit Excel-Tabellen erstellt werden. Sie müssen einen kleinen Editor erstellen, der Daten auf leicht verständliche Weise anzeigt und Daten so generiert, dass das Spielprogramm sie verstehen kann. Ich bevorzuge C # mit Windows Forms, da es sehr einfach ist, irgendetwas darin zu machen.

Erwarten oder verlangen Sie nicht, dass Ihre Spiel-Tweaker alles selbst schreiben. Das ist nur, dass du faul bist. Das Schreiben von Programmen, auch wenn Skripte unsere Aufgabe sind, nicht ihre, ist zumindest faul und im schlimmsten Fall gefährlich.

Aber das habe ich jedenfalls erlebt. Abschließend halte ich es für das Beste, mit Ihren Tweakern zu sprechen, sie zu fragen, welche Daten sie optimieren möchten und wie sie sich vorstellen, sie zu optimieren, und eine Lösung zu finden, die so nah wie möglich an den gewünschten ist. Die Spielbalance ist sehr wichtig und wir möchten, dass sie ihre Arbeit so gut wie möglich machen.

Das ist eine der vielen Aufgaben eines Spielprogrammierers.

Panda Pyjama
quelle
Excel ist sehr schön für ihre Formeln, ja, aber wir haben ein Problem, das ich momentan nicht lösen kann: Es gibt keine Arrays - nur Tabellen, dh wenn ich 10 Zeichen mit jeweils 4 Zaubersprüchen habe, muss ich 10 Objekte in der Zeichentabelle und 40 beschreiben Objekte innerhalb Zaubern Tabelle 4 und durch Kommata getrennte Zaubern spezifizieren ( Verbindungen als Teil der erzeugenden implementiert sind Sprache ) innerhalb Zaubern Spalte von Tabelle Zeichen , sondern wurde stattdessen Ansatz mit 4 Spalten in Tabelle ausgewählten Zeichen ( first_spell , second_spell ...) - beide sind sowieso ziemlich hässlich.
Slawischer
Nun, das war eine ziemlich spezifische Antwort, die mich neugierig macht: 2 verschiedene Programmierer haben fast die gleichen Dinge implementiert, um ihre verschiedenen Spiele zu erstellen, und noch mehr: Mein vorheriges Spiel war Einzelspieler, aber jetzt verwende ich den gleichen Ansatz (genau diesen Generator) in meinem MMO-Spiel, weil dort philosophische Programmiereinheiten gleich sind: Objekte, ihre Eigenschaften und Abhängigkeiten - passend für so unterschiedliche Spieltypen.
Slawischer