Wie kann ich zufällig 2D-Kachel-basiertes Side-Scroller-Terrain generieren?


11

Ich möchte zufällig eine Karte für ein 2D-Side-Scroller-Spiel mit dem folgenden Kachelsatz erstellen: Geben Sie hier die Bildbeschreibung ein

Ich habe einige großartige Artikel zum Bitmasking-Prozess gefunden, zum Beispiel: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -Methode zum Anwenden von Tilemaps /

Ich mag die Idee, eine Bitmaske / Tilemask zu verwenden, anstatt eine große if-Klausel oder switch-Anweisung auszuführen.

Ich habe jedoch Probleme, den gesamten Prozess zu visualisieren, und keiner dieser Artikel befasst sich mit Randomisierung.

Meine Kacheln passen auf verschiedene Arten zusammen, nicht nur auf eine Weise, wie es die Kacheln in den Beispielen scheinen, die ich verlinkt habe.

Zum Beispiel hier nur einige Beispiele:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Da meine Kacheln auf viele verschiedene Arten zusammenpassen, glaube ich nicht, dass eine 8-Bit-Maske funktioniert. Daher habe ich mir überlegt, eine größere Bitmaske zu verwenden. So etwas wie char [8] oder char 4 .

Wenn jemand bitte einige Pseudocodes / Beispiele zeigen könnte, wie der allgemeine Algorithmus aussehen würde, würde ich es sehr schätzen.

Antworten:


3

Ja, die Maskengröße würde mit zunehmender Anzahl von Optionen zunehmen - Ihr eigener Link http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ zweiter Teil erklärt die Hauptidee.

Im Wesentlichen müssten Sie X Möglichkeiten für jede 'Grenze' zwischen Kacheln aufzählen. In Ihrem speziellen Beispiel sieht es so aus, als ob die "Kachel oben / unten" entweder (1) weiß (2) bedeckt oder (3) halb bedeckt sein kann - was zufällig mit dem im Artikel angegebenen "trinären" Beispiel übereinstimmt.

Die Masken würden Ihnen jedoch nur dabei helfen, die Kachelmöglichkeiten auf diejenigen zu beschränken, die gezeichnet werden können. Sie sind an sich keine Methode, die zeigt, wie die tatsächlichen Karten auf vernünftige Weise generiert werden.

Ihr spezielles Kachelset ist tatsächlich ziemlich restriktiv - es beschreibt nur eine einzelne Oberfläche, die steigt / fällt, und an jedem Startpunkt auf Ganzzahl-Ebene haben Sie nur wenige gültige Auswahlmöglichkeiten. Beispielsweise sind nach Kachel 2 nur Kacheln 1 oder 8 möglich. Sie können einfach von links nach rechts wechseln, eine Liste erstellen, welche (wenigen) Kacheln nach der vorherigen Kachel kommen können, und zufällig eine davon auswählen.


Ich denke, das ist die Antwort, die ich suche, aber es ist immer noch etwas bewölkt. Können Sie im Text oder im Pseudocode etwas detaillierter beschreiben, wie der letzte Teil Ihrer Erklärung funktionieren würde? "Sie können einfach von links nach rechts gehen, eine Liste erstellen, welche (wenigen) Kacheln nach der vorherigen Kachel kommen können, und zufällig eine davon auswählen."
Erebel55

1
Haben Sie für jeden Kacheltyp eine Liste, welche Kacheln danach zulässig sind - es gibt so wenige Kacheln, dass dies schnell manuell durchgeführt werden kann. Die 'Höhe' ändert sich, füllen Sie alles unter der neuen Kachel mit # 10s.
Peteris

Ah, Sie sagen also, Sie sollen diese Methode anstelle der Bitmaske verwenden?
Erebel55

1
Ja, Bitmasking ist nützlich, wenn der gesamte 2D-Inhalt aussagekräftig ist, Ihre Karten jedoch einstufig zu sein scheinen, eine horizontale Oberfläche unterschiedlicher Höhe.
Peteris

Das macht Sinn, die "Berge" werden unterschiedlich hoch sein und ineinander fließen. Im Wesentlichen wird es also ein kontinuierlicher Berg sein, der die Höhe ändert, wenn Sie sich fortbewegen. So ähnlich wie eine Cosinus / Sinus-Welle, die an verschiedenen Punkten zufällige Größen hat. Sollte ich mich beim Generieren der Karte von links nach rechts oder von oben nach unten bewegen?
Erebel55

6

Haben Sie überlegt, eine 1D Perlin- oder Simplex-Rauschfunktion zu verwenden? Dies hat eine Reihe von Vorteilen, darunter:

  1. Unendliches (im Bereich der Gleitkommapräzision), sich nicht wiederholendes Gelände

  2. Kann in Echtzeit (auch in einem Shader, der schnell ist ) oder vorzeitig generiert und wie in Ihrem Beispiel in Texturen gespeichert werden

  3. Die Rahmen stimmen automatisch überein, da sowohl Perlin als auch Simplex kontinuierlich sind.

  4. Obwohl das Gelände selbst pseudozufällig ist, ist es einfach genug, eine Hüllkurvenfunktion anzuwenden oder einfach die Anzahl der Oktaven in Bereichen zu reduzieren, in denen Sie flache Bereiche oder andere spezifische Geländemerkmale benötigen.

Unter diesem Link finden Sie eine ziemlich ausführliche Erklärung der 1D Perlin-Implementierung.

Eine Hüllkurve ist im Grunde ein Skalarfeld oder eine Skalarfunktion, die mit der Rauschfunktion multipliziert wird, bevor Ihre Ausgabe gespeichert oder angezeigt wird.

Geben Sie hier die Bildbeschreibung ein

(Erstes Bild aus dem oben genannten Artikel entlehnt.)

In diesem Beispiel repräsentiert die rote Linie eine stückweise Funktion, die als definiert ist

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... die mit einer glatten Funktion besser definiert werden können. In diesem Fall werden die Dinge vor dem Plateau auf 0 und danach wieder auf 1 skaliert.

Aktualisieren

Hier ist ein Beispiel für ein 3D-Simplex- "Terrain" aus einem meiner Projekte, bei dem diffuse + spiegelnde Beleuchtung angewendet wird und die vollständig in einem Vert + Tess + Frag-Shader-Rohr erzeugt wird. Für Ihre Situation würde ich eine vertikale Scheibe daraus ziehen, um die Geländesteigung zu erhalten.

Geben Sie hier die Bildbeschreibung ein

Und eine orthografische Ansicht von oben nach unten:

Geben Sie hier die Bildbeschreibung ein


Dies ist eine Technik zum Erzeugen der eigentlichen Kachelbilder selbst?
Erebel55

1
@ erebel55 Ja. Sie können eine 2D-Funktion verwenden, um zu entscheiden, wo (basierend auf Ihrem Beispiel) verschiedene Kinder von Pflanzen in das Bild eingefügt werden sollen, und um auch das abfallende Gelände zu erzeugen. Ich habe dies in 3D mit großartigen Ergebnissen verwendet.
3Dave

Es sieht nach einer interessanten Methode aus. Ich bin mir nur nicht sicher, ob ich diesen Weg gehen möchte, da ich meine Bilder bereits erstellt habe.
Erebel55

@ erebel55 Ja, kein Grund, vorhandene Sachen wegzuwerfen, wenn es für dich funktioniert.
3Dave

Nun, ich habe die zufällige Generation noch nicht zum Laufen gebracht, aber ich hoffe es;) Ich habe Ihnen eine Gegenstimme für diesen Methodengedanken gegeben, da er interessant war und ich ihn möglicherweise in Zukunft verwenden werde. Vielen Dank
erebel55
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.