Zusammenfassung:
Mein zu 50% fertiggestellter 2D-Side-Scroller mit Box2D als Physik-Engine sollte in der endgültigen Version Multiplayer-Unterstützung bieten. Der aktuelle Code ist jedoch nur ein Einzelspielerspiel.
- Was sollte ich jetzt tun?
- Und was noch wichtiger ist, wie soll ich Multiplayer implementieren und mit Singleplayer kombinieren?
- Ist es eine schlechte Idee, den Einzelspielermodus getrennt vom Mehrspielermodus zu codieren (wie Notch es mit Minecraft getan hat)?
Die Leistung im Einzelspielermodus sollte so gut wie möglich sein (die Simulation der Physik mit einem Loopback-Server zur Implementierung des Einzelspielermodus wäre dort ein Problem).
Vollständiger Hintergrund / Fragen:
Ich arbeite an einem relativ großen 2D-Spielprojekt in C ++ mit der Physik als Kernelement. (Ich benutze dafür Box2D)
Das fertige Spiel sollte volle Multiplayer-Unterstützung haben, aber ich habe den Fehler gemacht, dass ich den Netzwerk-Teil nicht richtig geplant habe und im Grunde bis jetzt an einem Einzelspieler-Spiel gearbeitet habe.
Ich dachte, dass die Multiplayer-Unterstützung auf relativ einfache und klare Weise zum fast fertigen Einzelspielerspiel hinzugefügt werden könnte, aber anscheinend ist dies nach dem, was ich gelesen habe, falsch.
Ich habe sogar gelesen, dass ein Multiplayer-Spiel von Anfang an als eines programmiert werden sollte, wobei der Einzelspielermodus eigentlich nur darin besteht, einen unsichtbaren lokalen Server zu hosten und über Loopback eine Verbindung zu ihm herzustellen. (Ich fand heraus, dass die meisten FPS-Game-Engines dies so machen, ein Beispiel wäre Source)
Hier bin ich also mit meinem halbfertigen 2D-Side-Scroller-Spiel und weiß nicht wirklich, wie ich weitermachen soll.
Es scheint mir jetzt nutzlos, einfach weiter am Singleplayer / Client zu arbeiten, da ich später noch mehr umkodieren und umgestalten müsste.
Zunächst eine allgemeine Frage an alle, die sich möglicherweise in einer solchen Situation befanden:
- Wie soll ich vorgehen?
Dann die spezifischere - ich habe versucht herauszufinden, wie ich mich dem Netzwerkteil für mein Spiel nähern kann:
(Mögliche Lösungen:)
- Invisible / Loopback-Server für Einzelspieler
Dies hätte den Vorteil, dass es grundsätzlich keinen Unterschied zwischen Einzelspieler- und Mehrspielermodus gibt. Es würde nicht viel zusätzlicher Code benötigt.
Ein großer Nachteil: Leistung und andere Einschränkungen im Einzelspielermodus. Es würden zwei physikalische Simulationen laufen. Eine für den Client und eine für den Loopback-Server.
Selbst wenn Sie einen direkten Pfad für die Daten vom Loopback-Server bereitstellen, beispielsweise durch direkte Kommunikation durch die Threads, ist der Einzelspieler-Modus eingeschränkt.
Dies ist ein Problem, da Menschen gleichzeitig mit einer Vielzahl von Objekten herumspielen dürfen.
- Getrennter Einzelspieler- / Mehrspielermodus
Im Einzelspielermodus wäre kein Server beteiligt.
Ich bin mir nicht sicher, wie das funktionieren würde. Aber zumindest denke ich, dass es viel zusätzliche Arbeit geben würde, da alle Einzelspieler-Funktionen neu implementiert oder in den Mehrspielermodus geklebt werden müssten.
- Mehrspielermodus als Modul für Einzelspieler
Dies ist nur ein kurzer Gedanke, den ich hatte. Der Mehrspielermodus kann aus einem Einzelspieler-Spiel bestehen, bei dem ein zusätzliches Netzwerkmodul geladen und mit einem Server verbunden ist, der Daten sendet und empfängt und die Einzelspieler-Welt aktualisiert.
Im Nachhinein bedauere ich, dass ich den Mehrspielermodus nicht früher geplant habe. Ich stecke an diesem Punkt wirklich fest und hoffe, dass mir hier jemand helfen kann!
Antworten:
Ein Beispiel (mit Quelle) für latenzsichere Netzwerkphysik finden Sie hier: http://gafferongames.com/2010/03/11/gdc-2010-networked-physics-slides-demo/
Aber konzentrieren Sie sich zuerst auf das Gameplay Ihres Mehrspielermodus. Wenn es wettbewerbsfähig ist und Betrug (durch Reverse Engineering oder Paketmanipulation) ein Problem darstellt, entspricht die vorgeschlagene Lösung möglicherweise nicht Ihren Anforderungen.
Angenommen, Ihr Mehrspielermodus ist kooperativ. Für Ihren Einzelspielermodus. Ich würde nur die gleiche Spiel-Engine ausführen, aber mit deaktivierten Netzwerkfunktionen, damit die Welt nicht mit anderen Spielercharakteren bevölkert wird. Sie möchten wahrscheinlich auch bestimmte Daten für den Mehrspielermodus laden, um den Inhalt an die Anzahl der Spieler anzupassen.
quelle
Dieses Buch könnte Ihnen helfen. Ich glaube, dass die Firma, für die ich arbeite, die Beispiele in diesem Buch verwendet hat, obwohl wir kein Spieleladen sind.
http://www.amazon.com/Multiplayer-Programming-Prima-Techs-Development/dp/0761532986/ref=pd_sim_b_7
quelle
Ich denke, dass die positiven Aspekte eines lokalen Loop-Back-Servers die negativen bei weitem ausgleichen. Das Ausmaß der Code-Reduzierung ist meiner Meinung nach äußerst wertvoll.
Hinsichtlich redundante Physik - Simulationen ausführen, sollten Sie schauen in die Server - Zecken, hat Ventil eine große writeup auf sie hier . In einer lokalen Serverumgebung können Sie möglicherweise die "Client-Simulation" entfernen und einfach vollständige Aktualisierungen senden, und zwar in einer Situation nur vor Ort, um redundante Physiksimulationen zu vermeiden, da Sie über ausreichend Bandbreite verfügen.
quelle