Ich möchte zufällig eine Karte für ein 2D-Side-Scroller-Spiel mit dem folgenden Kachelsatz erstellen:
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:
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.
Haben Sie überlegt, eine 1D Perlin- oder Simplex-Rauschfunktion zu verwenden? Dies hat eine Reihe von Vorteilen, darunter:
Unendliches (im Bereich der Gleitkommapräzision), sich nicht wiederholendes Gelände
Kann in Echtzeit (auch in einem Shader, der schnell ist ) oder vorzeitig generiert und wie in Ihrem Beispiel in Texturen gespeichert werden
Die Rahmen stimmen automatisch überein, da sowohl Perlin als auch Simplex kontinuierlich sind.
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.
(Erstes Bild aus dem oben genannten Artikel entlehnt.)
In diesem Beispiel repräsentiert die rote Linie eine stückweise Funktion, die als definiert ist
... 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.
Und eine orthografische Ansicht von oben nach unten:
quelle