Wir generieren Kachelebenen und verstecken Quadrate vor dem Spieler


Levelgenerierung in unerforscht 2


Wir sind sehr stolz auf den Unexplored 2 Game Level Generator, ein Programm, das alle modernen Anforderungen erfüllt. In einem Beitrag werde ich darüber sprechen, wie Spielebenen erstellt werden.

Wir mussten das Rad nicht neu erfinden. In Unexplored 1 haben wir bereits Techniken entwickelt, die den Erfolg des ersten Spiels stark beeinflusst haben. Unexplored 2 setzte gerade fort, was gestartet wurde. Die Grundlage unserer Technologie besteht aus zwei Teilen: Wir verwenden eine mehrstufige Erzeugung, die fast einen Prozess simuliert, der der Arbeit eines Designers auf lebender Ebene sehr ähnlich ist. Darüber hinaus verwenden wir eine Technik namens " Cyclic Dungeon Generation ", mit der sich natürlich besser aussehende Ebenen erzeugen lassen als mit den meisten Standardanwendungen zur Erstellung generativer Inhalte. In diesem Beitrag werde ich über den ersten Aspekt sprechen. Die Anpassung der zyklischen Dungeon-Generation an Unexplored 2 wird das Thema eines zukünftigen Beitrags sein.

Nachahmung des Designs auf „menschlicher“ Ebene


Der Pegelgenerator unterteilt den Prozess der Pegelgenerierung in eine ganze Reihe geregelter Stufen. Es geht von der Planung auf hoher Ebene zu einer detaillierten Karte auf niedriger Ebene. Tatsächlich erstellt er zuerst eine Skizze des Levels und fügt dann Details hinzu, bis das Level abgeschlossen und gefüllt ist.

In jeder einzelnen Phase dieses Prozesses verwenden wir generative Grammatiken, um die in den vorherigen Phasen generierte Ebene zu transformieren. Insbesondere verwenden wir Kachelgrammatiken und Diagrammgrammatiken, bei denen es sich um Varianten allgemeinerer Zeichenfolgengrammatiken handelt, die einfach nach Teilen von Zeichenfolgen suchen und diese durch andere Zeichenfolgen ersetzen, ähnlich wie dies bei regulären Ausdrücken der Fall ist. Wenn Sie mit den Konzepten generativer Grammatiken und regulärer Ausdrücke nicht vertraut sind, empfehle ich Ihnen, im Internet nach Beispielen zu suchen (oder einfach weiterzulesen - Sie benötigen keine gründlichen Kenntnisse, um die Bedeutung dieses Beitrags zu verstehen).

Die erste Stufe des Levels ist relativ einfach. Wir verwenden eine Bitmap mit niedriger Auflösung, um die Grundlagen des Levels zu lokalisieren. Im folgenden Beispiel ist die Ebene zunächst sehr einfach: Sie besteht nur aus dem Eingang (e) links, dem Eingang rechts und der Verbindung des direkten Pfades. Die meisten anderen Kacheln sind entweder undefiniert (u) oder blockiert (B), da sie sich an den Rändern des Levels befinden.


Abbildung 1: Eine einfache Skizze des Levels

In der nächsten Phase werden Details hinzugefügt: Es erscheint eine Gruppe von Räumen, die durch Tore verbunden sind und so gestaltet sind, dass sie in eine bestimmte Richtung verlaufen:


Abbildung 2: Struktur hinzugefügt

Kachelkarten eignen sich hervorragend zum Erstellen von Ebenengeometrien. Es ist jedoch praktischer, mit Diagrammen zu arbeiten, um Strukturen und Spiellogik zu generieren. Dies ist, was der Generator als nächstes tut:


Abbildung 3: Basisdiagramm

In der Grafik enthalten einige Knoten Unterknoten, in unserem Fall sind die meisten Tore als gefährlich (H) und einige als offen (O) markiert.

Basierend auf einer relativ einfachen Analyse und generativen Regeln werden dem Diagramm neue Elemente hinzugefügt. Beispielsweise befindet sich der Endpunkt (G) an einem Ort, der weit genug von den Eingängen entfernt ist. Zusätzlich werden dem Diagramm kleine Gefahren hinzugefügt, um das Level bedrohlicher zu machen.


Abbildung 4: Neue Elemente zum Diagramm hinzugefügt.

In der Zwischenzeit wird eine Kachelkarte mit niedriger Auflösung mithilfe mehrerer Rauschfunktionen in eine Kachelkarte mit hoher Auflösung konvertiert, um ihr ein natürlicheres Aussehen zu verleihen:


Abbildung 5: Hochauflösende Kachelkarte

Anschließend werden die Informationen aus dem Diagramm verwendet, um die Kachelkarte zu dekorieren und neue Elemente hinzuzufügen:


Abbildung 6: Verzierte Kachelkarte.

Die Karte, wie sie ist, wird ausschließlich zur Präsentation im Gameplay generiert. Weiße Kacheln kennzeichnen offene Felder, und fast alle anderen Kacheln kennzeichnen sehr spezifische Spielelemente, z. B. einen Geheimgang durch die Büsche (grüne Kreise), „Tore im Dickicht“ (grüne Quadrate und lila Streifen) oder Laichplätze zum Binden von Bäumen (rote Kreise mit) Buchstaben s). Der Hauptteil des Levels ist noch undefiniert und zu diesem Zeitpunkt geht der Generator davon aus, dass diese Bereiche gefüllt werden sollten, um die Bewegung des Spielers zu blockieren.

Er führt diese Aufgabe auf mehreren Schichten aus: Die untere Schicht gibt die Höhe und Art der Oberfläche an, die zweite fügt an bestimmten Stellen Wasser hinzu und die dritte Schicht fügt Vegetation und andere Dekorationen hinzu.


Abbildung 7: Erdoberflächentypen (Gras, Schlamm und Steine)


Abbildung 8: Wasser


Abbildung 9: Vegetation und andere Dekorationen

Diese Ebenen werden dann zur Datendatei der letzten Ebene hinzugefügt, zu der einige weitere Details hinzugefügt werden. Das Spiel verwendet diese Daten, um Assets zu platzieren und das Level so zu erstellen, wie Sie es sehen. In dieser Phase gibt es viele Tricks. Beispielsweise können Sie feststellen, dass die Landplättchen in der obigen Abbildung seltsame Formen haben. Diese Formulare werden verwendet, um Bodenkacheln so zu erstellen, dass der Spieler nicht bemerkt, dass die Quelldaten eine Kachelkarte waren. Ich werde darüber im zweiten Teil des Artikels sprechen.


Abbildung 10: Bereitschaftsstufe

Gameplay hinzufügen


Diese Level-Generierungsmethode bietet viele Vorteile. Die Phase der Umwandlung eines Levels in ein Diagramm ist besonders wichtig, um die „Argumentation“ über das Gameplay für den Generator zu vereinfachen. In dem oben gezeigten Beispiel haben wir nichts damit gemacht, außer um zu überprüfen, ob Level-Ziele in einiger Entfernung von den Eingaben erstellt wurden. Für andere Ebenen in diesen Phasen werden jedoch mehr Aufgaben ausgeführt.

Nehmen Sie zum Beispiel eine Höhlenkarte in einem klassischeren Dungeonstil (im Vergleich zum Waldniveau aus dem obigen Beispiel). Das Basisdiagramm dieser Ebene hat nur einen Eingang und einige neue Tortypen. Ein Paar von ihnen ist geschlossen (L): Einige Tore fangen den Spieler von einer Seite ein (T), und dunkelgrün nenne ich das „Ventil“: Diese Art von Tor ermöglicht es dem Spieler, nur in eine Richtung zu gehen.


Abbildung 11: Basisanzahl der Höhle

Die Struktur dieses Levels ermöglicht es dem Generator, eine viel komplexere Mission zu erstellen. Zum Beispiel ist der einzige Weg, um dieses Level zu erreichen, ein „Ventil“, das den Spieler zwingt, nach einem anderen Ausweg zu suchen. Der Schlüssel zum Öffnen des Auswegs (unten links) befindet sich hinter der Gefahr oben links, und das Ziel befindet sich hinter den Toren, die den Spieler fangen. Ein Beispiel für ein solches Ziel wäre eine Passage, die hinter einem Spieler zusammenbricht. Im Allgemeinen entsteht dadurch eine Höhle, die auf eigene Faust interessant zu erkunden ist. Unexplored 2 bietet jedoch auch die Möglichkeit, Kreaturen und Ereignisse hinzuzufügen, die sich zur Laufzeit einfügen.


Abbildung 12: Der Höhle hinzugefügte Schlösser und Schlüssel

Mit dem oben beschriebenen Verfahren wird das Diagramm verwendet, um eine vollständig detaillierte Kachelkarte zu generieren und zu füllen. Die Anwendung verschiedener Parameter, die die Höhlennatur dieses Niveaus widerspiegeln, führt zu sehr unterschiedlichen Ergebnissen mit zerstörten unterirdischen Strukturen (blaue Quadrate, die mit dem Buchstaben c markiert sind) und breiten Abgründen mit Stacheln (lila Kreise):


Abbildung 13: Höhlenebene im Detail

Zusammenfassend


Ich hoffe, Sie haben eine allgemeine Vorstellung davon, wie wir uns der Erzeugung von Ebenen in Unexplored 2 nähern. Dies ist ein komplexer mehrstufiger Prozess, über den ich in naher Zukunft mehr schreiben möchte. Zumindest habe ich Ihnen bereits versprochen, über die Anwendung der zyklischen Dungeon-Generierung zu schreiben. Aber Sie können noch viel mehr erzählen, von generativen Erzähltechniken über das Rendern von Linien und Schattierungsmethoden bis hin zum langwierigen Entwurfsprozess, mit dem wir das Glückssystem erstellt haben, und anderen Aspekten.

Teil 2. Von Kacheln zu Kurven oder Spaß mit Voronoi zählt



Der unerforschte 2-Inhaltsgenerator generiert Kachelkarten. Ein typisches Ergebnis sieht folgendermaßen aus:


Diese Kachelkarten sind übereinander gestapelt und verwenden verschiedene Kacheln, um die Arten der Erdoberfläche (in diesem Beispiel Gras oder Schmutz) sowie verschiedene Dekorationen anzuzeigen. In diesem Fall gibt es mehrere Büsche (große grüne Kreise), Steine ​​(schwarze Kreise), Pflanzen (kleine grüne Kreise), Blumen (weiße Kreise) und dekorative Texturen (graue Quadrate). Es gibt auch spezielle Kacheln, die Spieldaten anzeigen, z. B. Spawnpunkte, die mit dem Buchstaben "s" gekennzeichnet sind. Darüber hinaus können Kacheln mit zusätzlichen Informationen markiert werden, z. B. Höhenstufe oder spezielle Untertypen.

Kachelkarten sind eine Datenstruktur, die für Generatoren praktisch ist. Gleichzeitig ist es jedoch recht einfach und das Raster ist im Spiel oft bemerkbar. Nach dem Laden der Daten in das Spiel und dem Platzieren der Assets sieht das Ergebnis jedoch folgendermaßen aus:


Ich denke, wir haben die Fliesen ziemlich gut versteckt, und so haben wir es bekommen.

Voronoi Magie


Der Trick besteht darin, dass einzelne Kacheln den Zellen im Voronoi-Diagramm entsprechen. Dieses Diagramm kann verwendet werden, um viel natürlichere Formen zu erzeugen. Das Voronoi-Diagramm wird erstellt, indem die Ebene mit zufälligen Punkten ausgesät und in Zellen unterteilt wird, sodass jeder Punkt auf der Ebene zu der Zelle gehört, die dem nächsten Startpunkt entspricht. Bei der Erstellung von prozeduralen Inhalten können Voronoi-Diagramme auf verschiedene interessante Arten verwendet werden.

Ein typisches Voronoi-Diagramm wird aus einer zufälligen, aber ziemlich gleichmäßigen Verteilung der Erzeugungspunkte erstellt, die ungefähr so ​​aussieht:


In Unexplored 2 verwenden wir eine andere Art der Verteilung von Erzeugungspunkten. Zuerst generieren wir einen Punkt für jede Kachel. So können wir sicher sein, dass jede Kachel auf der Kachelkarte einer Zelle im Voronoi-Diagramm entspricht.

Wenn wir die Erzeugungspunkte in der Mitte jeder Zelle platzieren, erhalten wir ein gerades Gitter, das genau wie eine Kachelkarte aussieht (für dieses und andere Bilder unten habe ich eine Schachversion erstellt, in der die Hälfte der Kacheln gelb dargestellt wird, damit Sie es etwas besser machen können siehe Muster):



Am einfachsten ist es, das Diagramm zu verbessern, indem Sie einfach die Position jedes Erzeugungspunkts randomisieren. Wenn Sie Punkte verschieben, sollten Sie überprüfen, ob der Punkt nicht über die ursprüngliche Kachel hinausgeht.

Das Ergebnis sieht ungefähr so ​​aus:



Schon besser, aber sehr laut, und damit keine schönen Wickellinien bekommen. Das Bild kann verbessert werden, indem Voronoi-Diagramme „entspannt“ werden (dies ist eine Standardtechnik für sie, auf die ich hier nicht näher eingehen werde). Es bleibt jedoch immer etwas laut, und es ist schwierig, die Zahlen auf einer Skala, die die Skala der einzelnen Kacheln überschreitet, effektiv vorherzusagen.

Um dieses Problem zu lösen, müssen wir uns nicht nur zufällig bewegen, sondern uns diesem intelligenteren Ansatz nähern. Unterschiedliche Bewegungsarten können sehr unterschiedliche Auswirkungen haben. Wenn Sie beispielsweise Perlin-Rauschen verwenden, erhalten Sie interessante kurvige Kachelkarten. Oder Sie können das gesamte Raster in sechseckige Kacheln verwandeln, indem Sie einfach jede zweite Linie der Erzeugungspunkte nach links verschieben:



Wir haben einen echten Durchbruch erzielt, als wir begonnen haben, die Erzeugungspunkte in bestimmten Mustern zu verschieben, um abgerundete Ecken zu erstellen. Die erste Stufe dieses Prozesses wird bereits im Füllstandsgenerator durchgeführt. Die Winkel zwischen verschiedenen Arten der Erdoberfläche werden erkannt, und Eckkacheln sind mit verschiedenen Figuren markiert, die angeben, wie sie verformt werden, um eine schönere Umgebung zu schaffen:


In diesem Fall führt der Unterschied in den Höhenstufen auch dazu, dass Winkel auf der Kachelkarte angezeigt werden. Deshalb sehen Sie oben rechts und unten links zusätzliche abgerundete Ecken im Gras, wo die Hänge erzeugt wurden.

Das Spiel verwendet diese Informationen, um die Erzeugungspunkte des Voronoi-Graphen zu verschieben. Jede abgerundete Ecke verschiebt die Position des Ursprungspunkts (siehe Abbildung unten). Außerdem verschiebt es die Erzeugungspunkte seiner vier orthogonalen Nachbarn. Dieser Prozess ist kumulativ; Generierungspunkte können sich mehrmals bewegen, wenn sie sich in der Nähe mehrerer Winkel befinden. Nach der Verarbeitung aller Offsets sind die Erzeugungspunkte jedoch etwas zufällig angeordnet (etwa 10% der Kachelbreite in jeder Richtung), und der endgültige Versatz ist auf maximal 40% der Kachelbreite begrenzt.


Das Ergebnis ist bereits von ziemlich hoher Qualität:



Aber wir sind noch nicht fertig ...

Mit Bedacht dekorieren


Die Gesamtform ist besser geworden, aber die Kanten sind immer noch sehr gerade und sehen irgendwie gezackt aus. Wir werden dies verbergen, indem wir gekrümmte Elemente an den Kanten platzieren, an denen sich die Farben unterscheiden. Der eigentliche Trick besteht jedoch darin, dass eine Kurve häufig an zwei Kanten platziert wird und ihre Winkel relativ zueinander verwendet werden, um die Richtung der Kurve zu bestimmen.


Das Ergebnis sieht folgendermaßen aus:


Als Nächstes haben wir 3D-Assets verwendet, um Texturausschnitte hinzuzufügen:


Schließlich fügen wir ein weiteres Asset hinzu, um das Level zu füllen. Der Standort dieser Assets wird durch die zuvor generierten Level-Daten bestimmt und folgt im Allgemeinen einfachen Prinzipien. Wir verwenden kleine Assets, die größere umgeben, um natürliche und schöne Übergänge zu schaffen. Insbesondere ist es erwähnenswert, dass am Fuße der Klippen Steine ​​hinzugefügt werden, die Variabilität erzeugen und die vertikalen Hänge, die für das Gameplay erforderlich sind, optisch weicher machen:


Lokale Variabilität


Winkel sind nicht die einzige Art der Verschiebung, die wir verwenden. Insbesondere möchten wir, dass die Kanten neben den künstlichen Strukturen (z. B. den unten gezeigten zerstörten Wänden) gerader sind:


In unserem System ist dieser Effekt leicht zu erreichen. Wir fügen einfach eine weitere Verschiebungsregel hinzu, die die Verschiebung von Fliesen mit künstlichen Strukturen verbietet. Der Generator verwendet kleine Quadrate, um solche Kacheln zu markieren, und das Spiel stellt sicher, dass alle Offsets einfach ignoriert werden:



Wenn Sie auf den Boden schauen, können Sie deutlich sehen, dass bestimmte Bereiche gerade sind, während andere sich natürlicher biegen:


Ist es nicht schön

Es gibt andere Regeln, die mit dieser Technik einfach hinzugefügt werden können. Zum Beispiel zwingen wir Kacheln manchmal, ein sechseckiges Muster zu erstellen, damit die schmalen Pfade breit genug bleiben, um sich um sie herum zu bewegen. Ich bin sicher, dass wir andere Verwendungszwecke für andere Muster finden werden.

Dies ist einer von vielen Gründen, warum ich Voronoi-Diagramme liebe. Ein anderes Mal werde ich darüber schreiben, wie wir sie verwenden, um Unexplored 2-Weltkarten zu generieren und zu dekorieren.

Source: https://habr.com/ru/post/de457766/


All Articles