Kürzlich wurde darüber diskutiert, wie man ein 2D-Side-Scrolling-Multiplayer-Spiel erstellt, das ein Loop-Level-Design haben kann (Denken Sie an Starbound und wie sich ihre Welten im Loop bewegen).
Ich dachte, der einfachste Weg wäre eine rechteckige Karte mit Triggerzonen, die Spieler von einer Seite zur anderen teleportieren könnten. Das offensichtliche Problem bei diesem Ansatz ist jedoch, dass sich mehrere Spieler gleichzeitig am Rand der Karte befinden. Du willst nicht nur Spieler voreinander teleportieren und brauchst eine Möglichkeit, Spieler zu transportieren, ohne dass andere Spieler verschwinden.
Um diese Idee anzufügen und das Problem zu beheben, habe ich mir Folgendes ausgedacht: eine Triggerzone (rotes Quadrat im Bild), in der Spieler eine "Klonzone" (grünes Quadrat) sehen können. In diesem grünen Quadrat werden Objekte von der gegenüberliegenden Seite der Triggerzone in die entsprechende Klonzone kopiert (erkennbar an den Formen A und B). Wenn ein Spieler die Startkante der "Klonzone" erreicht, wird er auf die andere Seite der Karte teleportiert.
In diesem Beispiel würde Spieler 2 denken, dass er Spieler 1 sieht, aber tatsächlich würde er seinen Klon sehen und umgekehrt.
Dies schien für das vorliegende Problem etwas extrem und komplex zu sein. Meine Frage ist nun, ob diese Lösung ein guter Ansatz zur Lösung des Problems ist oder ob es einen einfacheren Weg gibt, dieses Problem zu lösen.
quelle
Antworten:
Dieses System mit all diesen Triggern klingt etwas zu kompliziert und fehleranfällig.
Sie könnten die Position des Players mit modulo mit so etwas wie umschließen
playerPositionX = playerPositionX % mapWidth
Auf diese Weise , wenn der Spieler erreicht
playerPosition == mapWidth
dasplayerPosition
wird auf 0 zurückgesetzt.Diese Lösung könnte mit dem gesamten Renderingsystem erweitert werden.
quelle
pos - map_width
) gerendert werden .Die kanonische Lösung besteht darin, Portale zu verwenden . In Ihrem Beispiel gibt es nur eine Ebene, außer dass ein Portal das linke und das rechte Ende verbindet.
Wenn sich etwas über dieses Portal bewegt, werden die Koordinaten an das andere Ende des Portals verschoben. Wenn sich also etwas links durch das Portal bewegt, wird es auf der rechten Seite des Levels wieder angezeigt und umgekehrt.
Ihre Kamera muss auch die Portale unterstützen. Befindet sich das Portal in der Kamera, muss es Teile der Ebene auf beiden Seiten des Portals rendern. Wenn Sie mit Bildbearbeitungsprogrammen für nahtlose Kachelgrafiken vertraut sind, ist dies auch hier der Fall.
Der mühsame Teil ist, dass alles, was mit Distanz oder Pfadangaben zu tun hat, auch Portale unterstützen muss. Dies beinhaltet KI, Sichtlinienalgen, Schalldämpfung und so weiter.
Das Schöne an Portalen ist, dass es sehr mächtig ist. Die Build-Engine simulierte damit mehrstöckige Level, obwohl es sich nicht um eine "echte" 3D-Engine handelt. Einige moderne Motoren verwenden auch Portale, um nichteuklidische Räume zu erstellen. Portal und Vorkammer sind bemerkenswerte Beispiele in 3D.
quelle
Denken Sie daran, dass das, was Sie auf dem Bildschirm anzeigen und was sich im Speicher befindet, zwei völlig verschiedene Dinge sind. Stellen Sie sich vor, Sie haben ein Fenster, das Sie mit Daten über die Welt füllen müssen. Sie füllen das Fenster von links nach rechts. Während Sie Ihre Daten analysieren, um die Welt zu füllen, kehren Sie einfach zum Anfang Ihrer Daten zurück, wenn Sie das Ende der Welt erreichen. Die Verwendung einer Modulo-Operation ist ideal. Denken Sie daran, dass Sie dies für alles tun müssen . Projektile, Strahlen, Spieler, Physik; Sie alle müssen ihre Positionen eingepackt haben, wenn sie die Grenzen der Welt überschreiten.
Jeder Spieler teilt Daten, hat jedoch eine eigene Perspektive der Daten. Ihre Fenster sind unterschiedlich bevölkert, je nachdem, wo sie sich auf der Welt befinden.
Dies bedeutet, dass Sie keine Klone erstellen oder jemanden teleportieren müssen. Im Wesentlichen Sie sind die Schaffung Klonen, nur durch Zeichen zu jedem der anderen Bildschirmen zu machen.
quelle
Trennen Sie das Rendern von der Welt, und Sie können das Rendern umbrechen und korrigieren, ohne auf Klonen oder Teleportieren von Artefakten zurückgreifen zu müssen.
Erstens haben Sie in Ihrer Welt eine Welt mit fester Größe von
0
bisWidth
. Immer wenn ein Objekt unter 0 fällt, wird es bis zum Ende umgebrochen und jedes Mal, wenn ein Objekt vorbei istWidth
überdeckt wird, wird es bis zum Anfang . Dies bedeutet, dass alle logischen Objekte in Ihrer Welt immer in Reichweite sind0...Width
.Zweitens werden Sie für das Rendern Modulo für die Position ausführen. Die linke Seite des Bildschirms ist "Basis" und die rechte Seite ist "Basis + Größe". Sie suchen also in Ihrer Welt nach etwas in diesem Bereich. Sie suchen tatsächlich nach dem Modulo-Bereich, dem er zugeordnet ist
0...Width
.Der Trick bei der Suche besteht darin, die Position des Objekts relativ zum zurückzugeben
Base
linken Seite zurückzugeben. Dies wird in lokale Koordinaten des Bildschirms konvertiert, sodass sich der Renderer selbst nicht um das Modulo kümmern muss, sondern nur um die Suche.Sie müssen nichts klonen, da jeder Renderer das Objekt nur an einem Ort bearbeitet.
Wenn Ihre Welt in Segmenten oder mit 3D-Strukturen erstellt wird, müssen Sie sie segmentieren. Daher ist es kein zusammenhängender Block, sondern kann verschoben werden, um diesem Rendering Rechnung zu tragen. Sie brauchen nicht viele Blöcke, mindestens 2.
quelle
Ich denke, der einzig vernünftige Ansatz wäre, Ihre verpackte Welt in einer zugrunde liegenden Datenstruktur zu implementieren, die für das Spiel und den Benutzer völlig transparent ist. Auf einigen Low-Level-Karten haben Sie also eine Funktion mapCoordinate (), die Ihre tatsächlichen Koordinaten in die zugrunde liegende Kartenressource einfügt ...
Wenn Ihre tatsächliche Welt also nur 10 Einheiten breit ist, werden der Spieler und das Spiel es nicht wissen. Für den Spieler ist die Welt unendlich - und wenn das Spiel fragt, was sich auf Position 15 befindet, übersetzt die zugrunde liegende Funktion diese Anforderung modulo10 und gibt den Gegenstand auf Position 5 ein.
Für die gesamte Spiellogik und alles andere ist es so, als hätte man eine unendlich große Welt, in der es zufällig Kopien von allem gibt.
quelle
Es ist nicht ganz dasselbe, aber ich habe etwas Ähnliches bei einem Game Jam implementiert. Das Spiel hatte Spieler, die sich auf einer kleinen kreisförmigen Ebene bewegten und herumgewickelt wurden, als der Spieler eine 'x'-Position von pi erreichte. Das Rendern war einfach, da wir einfach alles gerendert und dann eine Offset-Kamera gedreht haben, um zu verfolgen, was gerade vor sich ging. Sie könnten etwas Ähnliches implementieren, wie oben vorgeschlagen wurde:
quelle