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.
Texte / Der dynamische Kartengenerator - Teil IIDies 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. LochmaskenIn 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:
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:
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. TransformationenEin weiteres, wichtiges Element, um nicht zu sagen eines der Kernstücke der Landschaftsgeneration, sind die Maskentransformationen. Hier ein Beispiel:
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):
'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 AlgorithmenMit 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:
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 weiterDas 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. 18 Kommentare |
ich blicke nur noch nicht ganz was die operatoren machen
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!
Muss man das verstehen? Ich verstehe es jedenfalls nicht.
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 ;)
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
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.
icke
Übrigens, falls du jemals was zu Schreiben gedenkst - ein Account auf dem CC wäre in Sekundenschnelle erstellt :)
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...