|
|||||||||||||||||||||||||||||||
| ISBN: 3827320666 ISBN: 3827320666 ISBN: 3827320666 ISBN: 3827320666 | |||||||||||||||||||||||||||||||
|
|
Wir empfehlen: | ||||||||||||||||||||||||||||||
LandschaftsgeneratorIn diesem Kapitel möchte ich euch die Technik zur Erstellung einer 2D - Landschaft, wie ich sie in dem Spiel Castles verwendet habe, vorstellen. Auch in diesem Fall gilt wieder, dass ich auf die Main - Klasse des Applets nicht näher eingehen werde, genausowenig werde ich die Klasse Stars besprechen, die im Hintergrund die Sterne zeichnet. Beide Klassen sind jedoch denkbar einfach und sollten eigentlich kein Problem darstellen. Widmen wir uns nun also zunächst der Problemstellung. Das ProblemWir wollen eine bergige Landschaft erzeugen um sie in einem Spiel wie Castles zu verwenden. Die Landschaft soll in jedem Spiel anders aussehen, also zufallsgeneriert sein, was die Verwendung von *.gif's o. ä. ausschließt, und muss die Fähigkeit besitzen nachträglich noch verändert werden zu können, z. B. wenn Bomben einschlagen... . Desweiteren darf die Menge an Daten, die gespeichert werden muss um die Landschaft festzulegen, nicht allzu groß sein um das Spiel nicht unnötig langsam zu machen. Zudem müssen wir uns auch überlegen, wie wir die Daten speichern wollen. Es gibt für diese Problemstellung sicherlich viele passende und gute Lösungen, von denen ich nun auf eine genauer eingehen möchte. Die Idee und Beschreibung des AlgorithmusUm die Datenmenge möglichst gering zu halten möchte ich die Landschaft aus vielen vertikalen Linien, und nicht aus einzelnen Punken, aufbauen. Reiht man für die gesamte Länge der Landschaft senkrechte Linien aneinander, so entsteht, sind alle Linien gleich lang und haben den selben Start- und Endpunkt, ein Rechteck. Ein Punkt der Linie, in unserem Fall der Untere (untere Grenze des Applets) kann für jede Linie einer Zufallslandschaft konstant gewählt werden. Wir müssen also nur den oberen Punkt, der sozusagen die Oberfläche der Landschaft bestimmt, variieren und in einem Array speichern.
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. Der Algorithmus
{
plus = 1; // Initialisierung des Faktors (Wert + oder - 1) faktor = 1; // Initialisierung des Startwertes der Oberfläche start = Math.abs(300 + (rnd.nextInt() % 50)); // Speichern des Startwertes an der ersten Stelle des Arrays map [0] = start; // Initialisierung der Startwerte für die Farben int greenvalue = 200; int redvalue = Math.abs(rnd.nextInt() % 200); int bluevalue = Math.abs(rnd.nextInt() % 201); // Speichern des ersten Startwertes für das Farbenarray colors [0] = new Color (redvalue, greenvalue, bluevalue); // Loop zur Initialisierung aller anderen Arrayfelder for (int i = 1; i < mapsize; i ++) {
last = map [i - 1]; // Entscheidet, ob die eingeschlagene Richtung gewechselt wird change = Math.abs(rnd.nextInt() % 10); // In 10% der Fälle ändert sich die Richtung und möglicherweise plus if (change > 8) {
faktor = - (faktor); // Wieviel wird addiert bzw. substrahiert plus = 1 + Math.abs(rnd.nextInt() % 2); /* Wird ein bestimmter Wert unter- bzw. überschritten, dann wird die Richtung geändert */ if (last > 350 || last < 120) {
faktor = - (faktor); // Hält die Farbwerte immer in einem bestimmten Rahmen if (greenvalue > 240) {
greenvalue -= 10; else if (greenvalue < 100) {
greenvalue += 10; // Werte für das Feld an i - Stelle werden berechnet map [i] = last + (faktor * plus); /** 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 */ greenvalue = greenvalue + (-faktor * plus); colors [i] = new Color (redvalue, greenvalue, bluevalue);
Applet ansehen Nächstes KapitelEin Leveleditor in Java |
|
||||||||||||||||||||||||||||||
![]() | |||||||||||||||||||||||||||||||
|
Back to the topic sites: StudyPaper.com/Startseite/Computer/Informatik/Programmieren/Java StudyPaper.com/Startseite/Computer/Spiele External Links to this site are permitted without prior consent. | |||||||||||||||||||||||||||||||
| Home | deutsch | Set bookmark | Send a friend a link | Copyright © | Impressum | |||||||||||||||||||||||||||||||