Multiplayer-Implementierung, Kann ich sie später implementieren, wenn ich dies möchte?

15

Ich plane, XNA zu verwenden, um ein Spielprojekt zu erstellen. Ich bin mir im Moment nicht ganz sicher, ob ich Multiplayer-Funktionen hinzufügen möchte oder nicht, da ich noch viele andere Probleme zu lösen habe, die ich noch nicht kenne. Ich möchte nicht, dass das Projekt aus dem Ruder läuft.

Meine Frage ist: Wenn ich mich in meinem Projekt befinde, ohne die Möglichkeit zu haben, Mehrspieler-Unterstützung hinzuzufügen, ist es dann einfach, rückwärts zu gehen (normalerweise nicht) und den erforderlichen Code hinzuzufügen, um ein Mehrspieler-Spiel zu erfassen?

Bryan Harrington
quelle

Antworten:

24

Die folgenden Ratschläge stammen aus dem Handbuch der Zoidcom-Netzwerkbibliothek :

Befindet sich Ihr Projekt in der Planungsphase, empfiehlt es sich, das Projekt von Anfang an für die Vernetzung zu konzipieren. Wenn Sie den Netzwerkcode zu einem späten Zeitpunkt des Projekts einbinden, wird dies höchstwahrscheinlich entweder zu massiven Umgestaltungen oder zu erheblichen Hackerangriffen führen, was zu kaum wartbarem und fehlerbehaftetem Code führt.

Am saubersten ist es, das gesamte Spiel so zu implementieren, als wäre es ein reines Netzwerkspiel. Implementieren Sie also Code für einen dedizierten Server und implementieren Sie diesen Code nur als Servercode. Implementieren Sie den Spiel-Client-Code auf ähnliche Weise. Server und Client können im selben Prozess ausgeführt werden und müssen nicht einmal einen echten Netzwerk-Socket verwenden. Sie sollten jedoch separate Entitäten sein und der gesamte Code sollte so gestaltet sein, dass er auf diese Weise funktioniert. Wenn der Spieler springt, ändern Sie den Sprungvektor des Spielers nicht direkt, sondern senden Sie ein Paket mit gedrückter Sprungtaste an den Server und lassen Sie den Server damit umgehen.

Dies bedeutet, dass selbst in einem Einzelspielerspiel ein unsichtbarer Server im Hintergrund ausgeführt wird. Eine Multiplayer-Version desselben Spiels muss nur eine Verbindung zu einem Remote-Server herstellen, anstatt der lokalen und der Voila-Multiplayer-Version. Die Vorteile davon sind:

Kein separater Code für Single und Multiplayer Der Netzwerkcode wird während des gesamten Projekts getestet und weiterentwickelt

Projekte, die dieses Schema verwenden, sind fast alle Spiele, die eine der Quake-Engines, Civilization 4, Neverwinter Nights und vieles mehr verwenden.

Für die Verbindung von Client und Server im selben Prozess ohne Latenz können lokale Sockets verwendet werden. Diese werden von Zoidcom bereitgestellt und leiten Pakete direkt von einem ZCom_Control an einen anderen weiter, ohne einen Socket auf Betriebssystemebene zu durchlaufen.

Leftium
quelle
Es klingt so, als wäre dies ein Setup für reine Serverautorität, das ich hasse. Wenn Ihr Ping zum Server niedrig ist, spielt es gut. Wenn der Ping jedoch zu hoch wird, werden die Aktionen auf Ihrem Bildschirm verzögert. Ich bevorzuge die Methode, die die Quell-Engine verwendet, der Client führt Physik und Dinge lokal aus und jede Aktion wird sofort angezeigt, aber der Server überprüft sie immer noch, um sicherzustellen, dass die Leute nicht hacken und ob es Inkonsistenzen gibt, was hätte passieren sollen Sendet der Server den korrekten Status an den Player und überschreibt die Clientsimulation mit neuen Daten.
AttackingHobo
8
@ AttackingHobo: Sie beschreiben nur die Kundenvorhersage. Sie können die Client-Vorhersage und die Server-Autorität problemlos miteinander kombinieren. Dies schließt die im Zoidcom-Handbuch beschriebene Architektur überhaupt nicht aus.
@ AttackingHobo @ Joe: Und Zoidcom unterstützt tatsächlich die clientseitige Vorhersage ^^
Leftium
2

Ich stimme dem in der Antwort von Leftium zitierten Rat zu. Entwerfen Sie es von Anfang an für die Vernetzung, da Sie es später nicht mehr hinzufügen können .

Als ich das erste Mal versuchte, ein Multiplayer-Spiel zu machen (ich habe nicht einmal versucht, ein Singleplayer-Spiel zu machen!), Dachte ich, ich würde zuerst das Spiel zum Laufen bringen und dann das Netzwerk erweitern. Schlechte Idee. Ich hatte einen Prototyp eines wirklich langweiligen Einzelspielers und keine Ahnung, wie man das in ein Mehrspielerspiel verwandelt. Ich habe es komplett verschrottet und von vorne angefangen, diesmal habe ich von Anfang an Multiplayer-Netzwerkcode geschrieben. Alles hat geklickt.

Ich bin mir sicher, dass es nicht unmöglich ist , mit einem Einspieler-Spiel zu beginnen und Mehrspieler-Funktionen hinzuzufügen. Wenn Sie es sich überlegen, planen Sie es richtig und stellen Sie sicher, dass Sie Ihre Strategie kennen, und probieren Sie es aus. Ich denke, es wäre zumindest ein interessantes Rätsel, um es zu lösen. Aber stellen Sie wirklich sicher, dass Sie Ihren Plan kennen, wie Sie das Netzwerk erweitern.

Ich denke, es gibt einen Mittelweg (obwohl ich es noch nie ausprobiert habe). Sie können einige Dummy-Klassen für Netzwerk- / Multiplayer-Funktionen schreiben und diese beim Schreiben des Einzelspieler-Spiels mit Sorgfalt verwenden. Wenn Sie sich dann später für die Implementierung von Multiplayer entscheiden, füllen Sie einfach die Dummy-Klassen aus, und Sie sind fast fertig. Dies kommt der Server / Client-Methode sehr nahe, aber Sie können möglicherweise mit weniger Arbeit davonkommen. Immerhin ist ein Einzelspielerspiel einfacher zu erstellen als ein Mehrspielerspiel. Wenn Sie also Ihr Einzelspielerspiel wie ein Mehrspielerspiel schreiben, warum dann nicht einfach zum Mehrspielerspiel machen?

Ricket
quelle