Clonk-Center Titelbild

Texte / Der dynamische Kartengenerator - Teil II




Dies ist der zweite Teil des Tutorials zur Erstellung dynamischer Landschaften über eine Landscape.txt. Wer den ersten Teil noch nicht gelesen hat, der sollte dies hier nachholen.

Lochmasken

In diesem Kapitel sollen nun echte Zufallskarten mit wirklichem Zufall erstellt werden. Dazu erinnern wir uns an das erste Kapitel zurück, in dem beschrieben wurde, dass jede Ebene eine 1-Bit-Textur besitzt. Das heißt im Klartext, dass jedem Punkt in einer Ebene ein Wert zugewiesen wird, der besagt, ob er gezeichnet wird order nicht. Oder einfacher: Es werden Löcher in die Maske geschnitten.

Die Form und das Muster dieser Löcher wird durch sogenannte Algorithmen bestimmt. Der nicht ganz glücklich gewählte Name soll besagen, dass über eine zweidimensionale Funktion für jedes Pixel eindeutig bestimmt wird, ob es ausgefüllt sein soll. Man kann sich diese Funktionen der Einfachheit halber aber einfach als Muster vorstellen. Und so soll also einmal in unserem ersten Beispiel ein einfaches Muster zu einer Ebene zugewiesen werden:

Fast schon Zufall
Noch ist der Zufall gering...
map Example4 { mat=Water; tex=Smooth; overlay { mat=Gold; tex=Rough; x=10; y=10; wdt=80; hgt=80; algo=bozo; }; };

Entscheidend ist die Zeile "algo=bozo;" - hier wird aus der ansonsten flächig mit Gold ausgefüllten Ebene alles außer ein paar ellipsenförmigen Klumpen herausgeschnitten.

Zur weiteren Ausgestaltung erinnern wir uns wieder an das vorherige Kapitel zurück, und bilden eine Operatorkette:

map Example5 { mat=Water; tex=Smooth; overlay { x=10; y=10; wdt=60; hgt=60; algo=bozo; } ^ overlay { mat=Gold; tex=Rough; x=30; y=30; wdt=60; hgt=60; algo=random; a=3; }; };
Analkette, lors!11
Kräuselzufall

In der zweiten Ebene kommt nun eine weitere Maske zum Einsatz: random. Diese schneidet einfach zufällige Pixel heraus. Der zusätzliche Parameter "a=3;" wirkt sich auf die Generierung der Maske aus. Bei random gibt er an, mit welcher Häufigkeit Pixel herausgeschnitten werden. Bei anderen Algorithmen wie bozo ist es die Fleckgröße, bei mandel die Iterationstiefe, usw. Was sich im Einzelnen mit diesen Extraparametern kontrollieren lässt, ist in der Dokumentation beschrieben. Zunächst soll uns aber die Tatsache reichen, dass es ein Wert ist, mit dem man herumspielen kann, um damit den (mehr oder weniger ;) )gewünschten Effekt zu erzielen.

Transformationen

Ein weiteres, wichtiges Element, um nicht zu sagen eines der Kernstücke der Landschaftsgeneration, sind die Maskentransformationen. Hier ein Beispiel:

Turbulente Texturen
turbulence
map Example6 { mat=Water; tex=Smooth; overlay { mat=Earth; tex=Smooth2; x=10; y=10; wdt=60; hgt=60; turbulence=100; algo=bozo; }; overlay { mat=Gold; tex=Rough; x=30; y=30; wdt=60; hgt=60; algo=random; turbulence=100; loosebounds=1; }; };

Wie unschwer zu erkennen ist, werden die Formen allmählich natürlicher :). 'turbulence' verschiebt die Punkte einer Maske mit Hilfe einer Sinusfunktion, so dass aus den regelmäßigen Formen wirre und krumme Gebilde werden. Für die turbulence-Werte setzt man normalerweise Zehnerpotenzen ein, wobei der Effekt natürlich mit größer werdenden Werten verstärkt wird.

Dazu gibt es dann noch die Standardmittel zur affinen Transformation: Skalierung (zoomX, zoomY), Verschiebung (ox, oy) und Drehung (rotate):

map Example7 { overlay { mat=Rock; tex=Ridge; x=10; y=10; wdt=60; hgt=60; algo=lines; a=5; b=10; zoomX=-50; zoomY=-50; turbulence=10; }; overlay { mat=Gold; tex=Rough; x=30; y=30; wdt=60; hgt=60; algo=lines; a=5; b=10; zoomX=50; zoomY=50; rotate=45; turbulence=10; }; overlay { mat=Earth; tex=Smooth; x=0; y=50; wdt=20; hgt=20; rotate=30; loosebounds=1; }; };
Einige Transformationen
Skalierung und Rotation

'algo=lines' ist eine Maske mit vertikalen Streifen, wobei die Parameter die Streifendicke und den Abstand zweier Streifen angeben (a ist die Streifenbreite, b der Abstand inklusive a). Bei der Rotation mit loosebounds ist außerdem Vorsicht geboten, da um den Punkt 0/0 (obere linke Ecke) rotiert wird. Es könnte also passieren, dass der Bereich durch diese Rotation aus dem sichtbaren Landschaftsrechteck herausrutscht. Man kann dann zur Korrektur eine Verschiebung mit Hilfe von ox und oy durchführen.

Achtung: Transformationen gelten ebenfalls nicht für innere (verschachtelte) Ebenen! Dies wäre besonders bei turbulence eher unhandlich.

Weitere Algorithmen

Mit diesen Mitteln lassen sich nun schon (wenn auch sehr umständlich) die meisten Landschaften gestalten. Dazu sollte man natürlich die vorhandenen Masken kennen und zu nutzen wissen. Ich werde hier einmal zwei weitere im Beispiel vorstellen:

Felsland
Eine wasserreiche Felslandschaft
map Example8 { overlay { mat=Earth; tex=Rough; algo=sin; zoomX=30; zoomY=-100; oy=10; turbulence=100; overlay { algo=rndchecker; turbulence=1000; } & overlay { mat=Rock; tex=Rough; x=-10; wdt=120; hgt=80; loosebounds=1; turbulence=1000; overlay { mat=Rock; tex=Ridge; algo=rndchecker; zoomX=-100; zoomY=-100; turbulence=1000; }; }; overlay { algo=rndchecker; a=3; turbulence=1000; } & overlay { algo=bozo; a=4; turbulence=100; } ^ overlay { mat=Water; tex=Smooth; algo=lines; a=4; b=40; turbulence=1000; }; }; };

In dieser kleinen Landschaft sind nun schon eine Menge Tricks kombiniert worden. Fangen wir oben an: Für die Karte selber (map Example8) ist kein Material angegeben; es wird also Himmel verwendet. In dieser Karte befindet sich nur eine einzige Ebene mit einer Maske 'sin'. Diese ist eine einfache Sinuswellenfunktion (mit leichter Turbulenz und etwas nach unten verschoben), die alles umfasst, was unter dieser Sinuswelle liegt. Da sich alle anderen Ebenen innerhalb dieser äußeren Ebene befinden, werden auch sie nur unterhalb der Sinuswelle gezeichnet. So fliegen weder Steinfelder noch Wasser im Himmel.

Im Erdreich befindet sich nun zunächst eine diesen gesamten Bereich umfassende Ebene mit der Maske 'rndchecker'. Dieser entspricht quasi einem Schachfeld, auf dem die Felder nicht regelmäßig, sondern immer zufällig weiß oder schwarz (bzw. "durchsichtig") angemalt wurden (das regelmäßige Schachfeld entspräche dem algo 'checker'). Die Ebene wird sodann noch mit einer reinen Bereichsebene (kein algo) und dem &-Operator kombiniert, so dass nur im oberen Teil der Karte Stein zu finden ist. In den Stein wird dann noch eine weitere Ebene mit zufällig verteiltem Stein aber anderer Textur gelegt, so dass im Endeffekt die Steintextur mehr Abwechslung bekommt, da diese innere Ebene ja nur gezeichnet wird, wenn auch die äußere gezeichnet war.

Bei der Bereichslimitierung vom Stein fällt auch noch auf, dass horizontal ein Bereich angegeben wurde, der außerhalb der Karte liegt. Dies ist bei angegebenem 'loosebounds=1;' und Turbulenz wichtig, weil eben auch die Grenzen mit verschoben werden. Hätte man nun den Standard (x=0; wdt=100;) gelassen, wären im linken und rechten Bereich der Karte deshalb weniger Steine gewesen.

Das Wasser ist dann grob gesehen mit bekannten Mitteln umgesetzt: Senkrechte Linien mit großem Abstand, kombiniert mit ein wenig rndchecker für zusätzlichen Zufall und ab und zu auftauchende, größere Wasservorkommen. Dazu natürlich alles mit turbulence versehen, damit keinen eckigen, geometrischen Formen entstehen.

So ist also mit wenigen, einfachen Mitteln eine fast schon brauchbare Landschaft entstanden. Sie hat sicher noch Schwächen und ist etwas eintönig, aber das lässt sich durch zusätzliche Ebenen und komplexere Kombinationen beheben. Eine gute Zufallskarte erstellen bedeutet immer auch, zu experimentieren. Manchmal ist ein ungewollter Nebeneffekt im Spiel interessant - wenn ab und zu mal mitten im Spielfeld ein Goldberg steht, bringt das schließlich nur zusätzliche Abwechslung. Und das war genau das, wofür der dynamische Zufallskartengenerator sorgen sollte.

Und es geht weiter

Das war natürlich noch lange nicht alles: Es werden noch ein oder zwei Teile folgen, die besonders auf Ordnungs- und Randmasken, Templates und Gruppen eingehen werden. Trotzdem sollte dieses Grundwissen der ersten beiden Teile für gute und interessante Zufallskarten schon reichen. Ich kann auf jeden Fall jedem Interessierten empfehlen, erst einmal selber zu versuchen, eine Karte zu erstellen, und sich im System des Generators zurechtzufinden.

Sven2 27.01.2002


18 Kommentare


30.06.2010 15:25 von Lord Helmchen:
ein wirklich gutes tutorial das ich nach ca. ner stunde anschauen geblickt hab^^
ich blicke nur noch nicht ganz was die operatoren machen

27.02.2009 1:18 von Profpatsch:
Wie wäre denn im nächsten Tutorial eine Anleitung, wie man Zufall in das Ganze bringt^^.
Oder hab ich da bloß eine Möglichkeit übersehen??

Wenn ich jetzt so eine tolle sin-Erdkurve habe und sie mit rotate=10; ein bisschen drehen will, aber nicht immer nur um 10° sondern um [-10..10]°, also aus allen Werte von eingeschlossen -10° bis eingeschlossen 10° einen zufälligen, für jede neue Berechnung anderen Wert erhalten will, wie stelle ich das dann an?

Ich hoffe ihr blickt bei dem Satz durch, ich hätte beim schreiben fast den Faden verloren ;).

Aber das Tut an sich ist spitze, ich weiß nicht ob irgendeiner (außer den Entwicklern :P) den Kartengenerator mit Hilfe der Doku beherrschen könnte.
THX!

29.07.2008 15:03 von Dragonclonk:
Wie vielfältig der Kartengenertor auch ist... super^^

01.10.2006 8:48 von s_m_w:
http://de.wikipedia.org/wiki/Mandelbrot-Menge

31.07.2006 12:17 von Flotterfloh:
also bei mir funkt das net...die landschaft ist und bleibt wie sie ist...wer kann mir weiterhelfen?

22.07.2006 14:56 von Luchs:
>mandel

>Zeichnet die Mandelbrotmenge in den Zielbereich.

Muss man das verstehen? Ich verstehe es jedenfalls nicht. confused

09.05.2006 17:33 von Sven2:
Wie in den anderen Kommentaren steht: Die Fortsetzung ist ein langfristiges Versprechen. Ein weiteres Tutorial schreibe ich dann, wenn ich ohnehin wieder etwas am Kartengenerator mache. Das heißt, zum Beispiel neue Features einbaue.

Ansonsten gefällt mir halt die momentane Funktionsweise so schlecht, dass ich sie lieber gar nicht erst weiter mit Tutorials erklären mag. Eine Liste der Algorithmen gibt es natürlich in der ganz regulären Dokumentation:

http://www.clonk.de/docs/de/sdk/scenario/MapCreatorS2.html

algo=mandel ist übrigens von Peter. Das habe ich nicht verbrochen ;)

01.05.2006 22:43 von Smith:
Wie wärs mit 'ner Fortsetzung?
Ich werde mich nämlich denk ich mal einarbeiten und würde dann schon gern noch mehr Tricks erfahren. Und was mal ganz brauchbar wäre: Eine Liste der wichtigsten Algorithmen, oder sind das alle, die hier genannt werden? Mehr fällt mir momentan nicht ein. Danke für dieses Tutorial. Es hat mich immerhin ein bißchen mehr verstehen lassen. Beim dritten Durchlesen morgen werde ich dann in Mape ein bißchen experimentieren.

Achja. Eine Liste für Operatoren wäre auch nicht schlecht. Wenn du mir das alles schickst könnte ich auch eine Liste mit Beispielen machen und du könntest das für dein nächstes Tutorial evtl. mitverwenden.
Zuletzt geändert: 02.05.2006 09:41

07.04.2006 20:02 von Jurkan:
Echt klasse Tutorial! Hatte ich schon lang mal lernen wolle, war aber zu faul dazu :(

25.08.2005 17:14 von Rombrand:
Hmm verstehe ich nit so richtig

15.07.2005 10:24 von Boni:
1. Also .bmp in .txt umwandeln ist Schwachsinn...
Da kommt absolut überhaupt nichts dabei raus.
2. Sind sie nicht da um eine zufällige Landschaft, sonder um eine, wie der Name schon sagt, dynamische Landschaft zu schaffen. D.h. eine an gewisse Vorgaben gebundene Landschaft.

14.07.2005 20:05 von Snyde:
Meinst du, dass man einfach so zuerst eine Landscape.bmp malt und dann einfach eine .txt umbenennen? Was würde dass für einen Sinn ergeben? Die Landscape.txt ist dazu da eine zufällige Karte zu schaffen, die aber trotzdem Menge und Art der Materialien und Texturen beinhaltet.

03.06.2005 21:30 von rotzseufer:
und wie krieg ich jetz meine anfängliche textdatei in eine bmp datei so wie bei den anderen szenarien??

icke

29.05.2005 21:03 von Tyron:
Man darf also gespannt sein :)

29.05.2005 12:21 von Sven2:
Ich wollte vorher noch Änderungen am Generator selber vornehmen (besser steuerbare turbulence; weniger regelmäßige Algorithmen für automatische Höhlenerstellung). Aber erstmal gibt es an NET2 genug zu tun.

27.05.2005 21:57 von Tyron:
ahja, Danke.
Übrigens, falls du jemals was zu Schreiben gedenkst - ein Account auf dem CC wäre in Sekundenschnelle erstellt :)

27.05.2005 16:57 von Sven2:
Der oberste Link ist tot.

Das mit den weiteren Teilen war übrigens eher ein langfristiges Versprechen, das ich (wie man am Datum des Tutorials sieht) vor drei Jahren gegeben hatte...

24.05.2005 12:32 von Erivid:
Hey, super! Jetzt weiß ich endlich wie das geht ;)