Erstellen einer nahtlosen Open World 2d-Spielkarte

7

Ich erstelle ein Open-World-Spiel ähnlich wie Pokemon. Sollte ich die vollständige Karte laden oder in Blöcke teilen und nur die Umgebung laden? Ich möchte nicht, dass mein Benutzer an einen Punkt gelangt, an dem er zwischen Karten wie Pokemon wechselt.

Wenn ich es in Stücke aufteilen würde, wie könnte ich sie nahtlos laden?

user49234
quelle
Entschuldigen Sie, aber würde es Ihnen etwas ausmachen zu klären, was Sie unter "wo wird die zweite Karte sein" verstehen? Sie scheinen ein Wort ausgelassen zu haben :)
Lysol
3
Wie groß wird Ihre Welt sein und was ist Ihre Zielplattform? Wenn es bequem in den Arbeitsspeicher Ihrer Zielplattform passt, gibt es wirklich keinen Grund, den Motor durch Chunk-Handling zu komplizieren.
Philipp
Für die Aufzeichnung laden Spiele wie Pokemon im Allgemeinen einen ganzen Bereich in den Speicher, aber der Schlüssel ist (wie Sie erwähnen), dass es keine endlosen Bereiche gibt. Es gibt logische Teile, die jeden Bereich aufteilen, z. B. Gruppen unpassierbarer Objekte. Es gibt keinen Grund, warum Sie nicht denselben Ansatz verwenden können, sondern einen nahtlosen Übergang verwenden (aber je nachdem, wie Sie dies implementieren, haben Sie möglicherweise zwei große
Blöcke gleichzeitig

Antworten:

1

Kurze Antwort: Abhängig von Größe und Art der Welt / Karte, aber im Zweifelsfall eine kachelbasierte Lösung mit einem Array verwenden.


Sie können von der Erstellung Ihrer Karte als 2D-Jigzaw profitieren, bei der Sie nur die relevanten Teile laden, die Sie tatsächlich auf dem Bildschirm anzeigen müssen. Der einfachste Weg, dies zu tun, besteht darin, Ihre Karte als aus Kacheln zusammengesetzt zu behandeln, wie dies in jedem alten, auf Schulkacheln basierenden Spiel von Mario bis Civilization 1 der Fall ist.

Kachelbasierte Spiele speichern normalerweise die Position von Objekten in einem Array, aus dem die Zeilen und Spalten von Kacheln, die sichtbar sein müssen, extrahiert und auf dem Bildschirm gezeichnet / positioniert werden. Dies erfolgt basierend auf den x / y-Koordinaten des Spielers in Bezug auf die Weltkoordinaten.

Um neue "Zeilen" oder "Spalten" der Karte zu laden, können Sie einfach überprüfen, ob sich der Player dem Rand des Bildschirms nähert, und dann mit dem Scrollen der Karte beginnen und nach Bedarf neue Zeilen oder Spalten aus dem Array laden / zeichnen.

Einige Beispiele finden Sie in diesem Tutorial:

http://gamedevelopment.tutsplus.com/tutorials/an-introduction-to-creating-a-tile-map-engine--gamedev-10900

Ich habe die Techniken vor über 10 Jahren selbst gelernt, als ich Flash-Spiele über diese hervorragenden (aber in Bezug auf den Code veralteten) Tutorials gemacht habe. Der Code und die Beispiele sind immer noch sinnvoll, funktionieren aber wahrscheinlich nicht in neueren Versionen von Flash.

http://oos.moxiecode.com/blog/index.php/tutorials/

Schauen Sie sich auch diese verwandte Frage an:

Ganzes Kartendesign vs. Kachel-Array-Design

Loeffe
quelle
0

Wenn Sie sich nicht sicher sind, wie Sie vorgehen sollen, haben Sie drei Möglichkeiten:

  • Halten Sie die Kartengrößen fest und erstellen Sie Karten gleicher Größe. Bearbeiten Sie einfach die Navigation
  • Verwenden Sie Kacheln und erstellen Sie jedes Mal Karten zum Laden von Landschaften (verwenden Sie Vorlagen für einen schnelleren Zugriff).
  • Holen Sie sich eine vollständige große Karte

Jetzt habe ich Methode 3 nicht implementiert, aber es scheint der offensichtliche erste Versuch zu sein, und es kann enden, wenn Sie sich endgültig entscheiden, Ihre große Welt auf Array und int size = 32 zu beschränken;

FÜR METHODE II müssen Sie einfachen 2D-Array-Code implementieren, einige Kacheln entwerfen (wie Ihr Beispiel aus Pokemon, das Wüsten-, Wasser-, Gras- und Stadtumgebungen enthält) und es aus Ihrer gespeicherten Zeigerreferenz laden

function starter(args:Event)
{
        thumb.startDrag(false, new Tile(track.x, thumb.y, track.width, 0));
}
function stopper(args:Event)
{
        thumb.stopDrag();
}
function mover(args:Event)
{this.Tile={Tile.water[0],Tile.water[1],Tile.grass[3]};}//each as in constructor
void(int * point){//img here}

Für Methode I müssen Sie hier ein wenig arbeiten und Vorlagen für jedes Design von Kacheln erstellen und diese korrigieren ... wie zum Beispiel, dass das Array für 100 Kacheln [10X10] oder gemäß Ihrer Spielfenstergröße und gemäß Ihrer gewünschten Frage festgelegt ist Sie müssen nahtlos sein, also laden Sie Arrays

a [10] [10] und a [10-20] [10-20] sowie einen temporären Array-Speicher für die halbe Liste hinzufügen

b [10-15] [10-15] = a [10-20] [10-20]:

Und implementieren Sie eine Kameratyp-Funktion, die Ihren Charakter fokussiert, sodass sich die Karte zusammen mit dem Charakter bewegt und Sie sich nahtlos bewegen

Hoffe das beantwortet deine Frage ...

Referenz http://pygame.org/project-pyMap+-+2D+Tile+Mapping-2769-.html

http://students.4j.lane.edu/~bortega23/ArcuzGuide.html Kartenabschnitt in Spiel Arcuz, Sie können auch Minikarte implementieren und weitere Zoom auf dieselben Daten wie in diesem Spiel erstellen

Unity 3D-Tutorials für Game Point Lightsource & Kameraansicht

Pavan Kate
quelle
0

Bei der Entwicklung offener Sandbox-Spiele muss man sich immer mit diesem Problem auseinandersetzen. Manchmal ist die Karte in Raster (DayZ Standalone), Sektoren (Battlestar galactica), Voxel (EVE) oder Zonen (wie pokemon) aufgeteilt und manchmal im RAM gespeichert hängt nur von der Kartengröße ab.

Wenn Sie eine 255x255-Karte haben, in der nur Ganzzahlen (0: Wasser, 1: Gras usw.) gespeichert sind, sind es (255x255x4) 260100 Byte (254 kB), sodass Sie die gesamte Karte in einem Array auf RAM speichern können. Wenn Sie für jede Kachel eine komplexere Datenstruktur haben oder wenn Sie mehr Kacheln haben, müssen Sie die Daten aufteilen.

In 2D-Spielen mag ich es, es in Kacheln zu zerlegen und die aktuelle Zelle und die angrenzenden Elemente zu laden, die ich jedes Mal benötige, wenn sich "aktuelle Zelle" ändert. Denken Sie daran, dass dies nur eine "logische" Unterteilung ist.

Sie können die gesamte Karte auf verschiedene Arten speichern, von DDBB zu .dat-Dateien oder .JSON. Es spielt keine Rolle, die neuen Zellen aus dem Speicher zu laden, bevor Ihr Zeichen eingeht, und Sie werden eine beneidenswerte Leistung erzielen.

PRDeving
quelle