2011-01-16 12 views
25

Ich entwickle eine 2D-Kachel-Engine und arbeite gerade an Algorithmen zur Kartengenerierung.2D-Kachel-Kartengenerierung

habe ich versucht, die grundlegend, die in der Regel in einfacher heightmap Generation beteiligt wie

  • Hügel Generation
  • Perlin Noise
  • Diamantquadrat

aber ich habe immer das gleiche Problem: diese Art Der Algorithmus scheint geeignet zu sein, wenn man mit Kacheln arbeitet, die auch eine Höhenkomponente haben, aber das ist nicht mein Fall.

Ich habe im Grunde Sprites wie Gras, das Meer, Wüste und so weiter, aber sie sollten sich nicht in der Karte platziert werden nach einer dynamisch erzeugten Höhe, aber so etwas wie

  • alles beginnt von Ozean
  • Inseln in der Mitte der Karte platziert (das ist, wo Algorithmen, die ich nicht meistens versucht)
  • Wüste erzeugt (sie wie zufällige Flecken sein sollte um)
  • berg und Hügel-Ketten hervorgebracht werden (sollten sie wie Schlangen sein)

Welche Art von Ansatz sollte ich versuchen?

Ich löste die Subkomponentenprobleme (wie Wüsten, Hügel und Berge), indem ich spezialisierte Algorithmen entwickelte, um das zu tun, was ich brauchte (zum Beispiel Berg startet von einem Punkt und dann einer Richtung mit einer Chance zu drehen), aber ich versage mit der Erzeugung der Grundinseln (die anpassbar sein könnten, um nur eine Pangea oder viele Grade der Größe zu sein).

Nur du eine praktische Idee zu geben, was für die ich bin auf der Suche etwas wie die Zivilisation Algorithmus:

alt text

+1

Zu der Zeit zu fragen, ich glaube nicht, das existierte. Heutzutage gibt es http://gamedev.stackexchange.com/ – Hooked

Antwort

14

[Hügel Generation, Perlin, Diamant square] ... diese Art von Algorithmen scheinen bei Kacheln geeignet zu sein, die auch eine Höhenkomponente haben, aber das ist nicht mein Fall.

Aber es ist Ihr Fall. Berge sind höher als Ebenen und Ebenen sind höher als Wasser.

     ___/ 
        ___/ ___ Mountain cutoff 
       ___/ 
     ______/ 
    ____/ ___ Water cutoff 
__/ 

können Sie Ihre Daten quantisiert, so dass, wenn es zwischen einer Gruppe von Ebenen ist, es als eine Art der Fliese gezählt wird, während, wenn sie in einem anderen Bereich ist, es ist eine andere Art der Fliese ist. Sie werden einige Details wegwerfen, aber Sie werden immer noch Konturen erhalten, die mit der Art von Rauschen übereinstimmen, das Sie erzeugen.

Es wird wahrscheinlich eine gute Portion Feinabstimmung erfordern, und Sie werden andere Landeigenschaften (neben unpassierbaren Bergen) selbst generieren müssen, aber Sie müssen viel mit jeder Content-Generation Lösung zwicken.

+6

Wenn Sie mehr Informationen über prozedurale Algorithmen zur Inhaltsgenerierung, Techniken, Erfahrungen usw. wünschen, habe ich vor kurzem [diese Wiki-Seite gefunden] (http://pcg.wikidot.com)/Kategorie-PCG-Algorithmen). Es scheint eine großartige Ressource zu sein und deckt die hightmap-Algorithmen ab, die Sie in Ihrer Frage erwähnt haben. Nicht meine Seite, noch bin ich in irgendeiner Weise mit ihnen beteiligt - es scheint einfach genial, also wollte ich es stecken :) –

15

Ich benutzte einen Ansatz, den andere als "Ameisen" zum Erstellen des zufälligen Geländes bezeichnet haben.Eine Beschreibung des verwendeten Ansatzes:

Zuerst erstellte ich eine Tilemap, indem ich ein zweidimensionales rechteckiges Array (x, y) einer spezialisierten Fliesenklasse verwendete. Die Kachelklasse enthält kachelbezogene Informationen wie den Zeichenpunkt und den Terrain-Typ.

Dann habe ich eine spezielle "ant" -Klasse erstellt, die man sich als eine unsichtbare Einheit vorstellen kann, die "Schritte" um die Kachelkarte macht. Jedes Mal, wenn sich die Ameise auf eine neue Kachel bewegt, wird der zugrunde liegende Terraintyp geändert. Die Ameise kann sich in 8 Richtungen bewegen und ändert die Richtung, jedes Mal wenn sie eine Kachel bewegt hat. Die Richtung, die es nach jedem Schritt nimmt, ist zufällig.

Ich spawn entweder eine feste oder zufällige Menge von Ameisen mit einer festen oder zufälligen Menge an Lebenszeit. Die Lebensdauer ist die Anzahl der Kacheln, die sie durchlaufen kann, bevor sie entfernt wird.

Um steuern zu können, welche Art von Gelände am gebräuchlichsten ist, erstelle ich ein "Terrain Type" -Array. Dieses Array enthält eine Liste der Terraintypen (im Grunde nur ein int). Um das gleiche Gleichgewicht zwischen allen Arten von Terrain zu erzielen, fügen Sie dem Terraintyparray jeweils nur einen Terraintyp hinzu. Wenn Sie möchten, dass ein bestimmter Geländetyp häufiger vorkommt, würden Sie dem Array weitere Einträge mit dem entsprechenden Geländetyp hinzufügen.

Wenn die Ameise bestimmen muss, welches Terrain geändert werden soll, suchen Sie im Terrain-Array nach einer zufälligen Ganzzahl als Array-Index.

Es braucht ein bisschen die Parameter zu verändern (Ameisenmenge, Ameisenlebewesen, Terraintyp-Array), aber ich erreiche bisher ein paar wirklich gute Terrains.

Es könnte weiter verbessert werden, indem komplexere Arten von Ameisenklassen verwendet werden, die zum Beispiel in spezialisierten Mustern durchlaufen werden. Um glaubwürdige Inseln in einem Ozean zu machen, möchten Sie wahrscheinlich das Ameisenverhalten modifizieren, so dass sie einige Einschränkungen haben in Bezug auf die Art und Weise zu bewegen (so dass Sie nicht zufällig lange "Spikes" von Land, sehr verstreut kleine Inseln usw.) bekommen.

Die folgende Abbildung zeigt eine Beispielfliese einer Gesamtstruktur, die prozedural durch eine kleine App erstellt wurde, die ich mit dem Ameisenansatz erstellt habe. Hoffe das kann dich auf den Weg bringen!

Sie können die Quelle der App (VB.NET) bei Github

Procedurally generated 2D tile map of a forest section

+1

+1; Dies ist ein interessanter Ansatz, ähnlich wie bei [Cellular Automata] (http://pcg.wikidot.com/pcg-algorithm:cellular-automata). Es scheint, dass Sie im Prinzip eine zufällige Verteilung mit Gruppierung erhalten würden, was auf den ersten Blick so aussieht, wie Sie es sich wünschen. Ich glaube nicht, dass Sie mit diesem Ansatz wahrscheinlich glatte Gradienten bekommen werden, besonders im Vergleich mit Perlin-Rauschen, da ich denke, dass es für bestimmte Kacheltypen (z. B. Bäume) viel überzeugender sein könnte. Wie für Ihre "Tabelle der Zahlen" ist dies ähnlich wie meine Antwort für [wie man eine PRNG gewichten] (http://stackoverflow.com/questions/3966809). –