📄 landscapedeu.html
字号:
<ol start="1" type="1">
<li>Wir legen zunächst zufällig einen Startpunkt fest.</li>
<li>Nun initialisieren wir den zweiten Punkt bzw. die zweite Linie so, dass sie sich nur um eins plus oder minus von der anderen, ersten Zahl unterscheidet.</li>
<li>Wir initialisieren auf diese Art und Weise alle Einträge im Array, indem wir vom letzten Eintrag entweder 1 abziehen oder hinzuaddieren.</li>
<li>Die Entscheidung über addieren oder subtrahieren überlassen wir ebenfalls dem Zufall, wobei in 90% der Fälle die eingeschlagene Richtung (also plus oder minus eins) beibehalten wird, während sie in 10% der Fälle wechseln soll.</li>
</ol>
<img src="tutorial_pics/Landscape2.gif" align="left" border="0">
<p align="justify">Wie ihr hier sehen könnt ist das Ergebniss dieses Ansatzes schon ziemlich brauchbar.
Es gibt nur ein paar kleine Probleme und "Unschönheiten". Zu einen passiert es immer wieder, dass die "Berge" und "Täler" über die Ober- und Untergrenzen des Applets hinausgehen. Zum Anderen sind die meisten Landschaften noch sehr monoton. In dem nun folgenden Teil möchte ich euch meinen "fertigen" Ansatz zur Generierung der Zufallslandschaft vorstellen. Davor noch kurz ein paar Hinweise. Zum einen habe ich nun einen weiteren Parameter eingeführt, der auch auf die Höhe der Addition bzw. Subtraktion Einfluss hat, wodurch steilere und weniger steilere Berge entstehen. Zum anderen variiere ich die Farbe der Linien und speichere diese Änderungen in einem Colorarray. Zu guter Letzt halte ich noch die Höhe bzw. Tiefe der Linien in einem gewissen Maximal- und Minimalbereich um Berge und Täler nicht zu hoch oder zu tief werden zu lassen.</p>
<br clear=all> <br>
<h3>Der Algorithmus</h3>
<ul>public void generateLandscape ()<br>
{<ul>
/* Initialisierung von plus, diese Variable bestimmt, wieviel hinzugezählt bzw. abgezogen wird */<br>
plus = 1;<br><br>
// Initialisierung des Faktors (Wert + oder - 1)
faktor = 1;
// Initialisierung des Startwertes der Oberfläche<br>
start = Math.abs(300 + (rnd.nextInt() % 50));<br><br>
// Speichern des Startwertes an der ersten Stelle des Arrays<br>
map [0] = start;<br><br>
// Initialisierung der Startwerte für die Farben<br>
int greenvalue = 200;<br>
int redvalue = Math.abs(rnd.nextInt() % 200);<br>
int bluevalue = Math.abs(rnd.nextInt() % 201);<br><br>
// Speichern des ersten Startwertes für das Farbenarray<br>
colors [0] = new Color (redvalue, greenvalue, bluevalue);<br><br>
// Loop zur Initialisierung aller anderen Arrayfelder<br>
for (int i = 1; i < mapsize; i ++)<br>
{<ul>
// Speichern der letzten Arrayposition des Höhenarrays<br>
last = map [i - 1];<br><br>
// Entscheidet, ob die eingeschlagene Richtung gewechselt wird<br>
change = Math.abs(rnd.nextInt() % 10);<br>
// In 10% der Fälle ändert sich die Richtung und möglicherweise plus<br>
if (change > 8)<br>
{<ul>
// Ändern der Richtung<br>
faktor = - (faktor);<br><br>
// Wieviel wird addiert bzw. substrahiert<br>
plus = 1 + Math.abs(rnd.nextInt() % 2);<br>
</ul>}<br><br>
/* Wird ein bestimmter Wert unter- bzw. überschritten, dann wird die Richtung geändert */
if (last > 350 || last < 120)<br>
{<ul>
// Ändern der Richtung<br>
faktor = - (faktor);<br>
</ul>}<br><br>
// Hält die Farbwerte immer in einem bestimmten Rahmen<br>
if (greenvalue > 240)<br>
{<ul>
// Wenn Farbwert zu groß wird, erniedrigen des Wertes<br>
greenvalue -= 10;<br>
</ul>}<br>
else if (greenvalue < 100)<br>
{<ul>
// Wenn Farbwert zu klein wird erhöhen des Farbwertes<br>
greenvalue += 10;<br>
</ul>}<br><br>
// Werte für das Feld an i - Stelle werden berechnet<br>
map [i] = last + (faktor * plus);<br><br>
/** Um die Farbewerte für zunehmende Höhe heller werden zu lassen, wird der Faktor umgekehrt. Dies ist wegen dem umgekehrten Koordinatensystem von Java nötig */<br>
greenvalue = greenvalue + (-faktor * plus);<br>
colors [i] = new Color (redvalue, greenvalue, bluevalue);<br>
</ul>}
</ul>}
</ul>
<p align="justify">
<img src="tutorial_pics/Landscape3.gif" align=left border="0" >Sind die beiden Arrays erst einmal initialisiert, so kann die Landschaft mit einer einfachen Paint - Methode die Farb- und Höhenarray durchläuft und jeweils eine Linie vom "Boden" des Applets zum Arraywert an der Stelle i in der dazugehörigen Farbe im Farbarray zeichnet, gezeichnet werden. Das Ergebniss dieses Algorithmus könnt ihr neben diesem Text sehen. Womit wir eigentlich schon am Ende dieses Kapitels angekommen sind. Wie ich schon erwähnt habe, könnte man auch jeden einzelnen Punkt der Landschaft speichern, wodurch sich vor allem noch interessantere Farbeffekte erziehlen lassen würden. Die Methode, wie ich sie vorgestellt habe ist allerdings ziemlich flexibel, schnell und sieht auch nicht unbedingt schlecht aus. Solltet ihr eingene Ideen haben, schickt sie mir oder am besten beschreibt sie kurz und schickt mir euer eigenens "Tutorial" Wie immer am Schluss könnt ihr euch das Applet ansehen und auch den Sourcecode runterladen!</p>
<a href="SourceCodes/Landscape/Landscape.zip">SourceCode download (*.zip - Datei)</a><br>
<a href="Applets/Landscape/Landscape.html">Applet ansehen</a>
<h4>Nächstes Kapitel</h4>
<a href="LeveleditorDeu.html">Ein Leveleditor in Java</a>
<!-- InstanceEndEditable -->
</div>
</td>
</tr>
<tr>
<td colspan="11" style="background-color:#990000" align="center">
<table width="100%" style="padding:0"><tr>
<td width="88" bgcolor="#993300"><div align="center" style="font-size:10px; color: #FFFFFF;"> <a href="#top"> to top </a></div></td>
<td><div align="center" style="font-size:10px; color: #FFFFFF;">
<a href="mailto:javacooperation@gmx.de">Fabian Birzele</a>, 2001-2004.<br>
web-design: <a href="http://www.freehand.str.ru/">Vadim Murzagalin</a>, 2004.
</div></td>
<td width="88">
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
<!-- InstanceEnd --></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -