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.
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?
quelle