Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 

2.4 Schritt 3: Vorbereitung der Spielsteine



Während der Initialisierung wird zunächst die Methode prepareImage aufgerufen, um die Bilddatei zu laden:

001 /**
002  * Lädt das Bild.
003  */
004 private void prepareImage()
005 {
006    //Bild laden
007    image = getImage(getDocumentBase(),getParameter("src"));
008    MediaTracker mt = new MediaTracker(this);
009    mt.addImage(image, 0);
010    try {
011       //Warten, bis das Image vollständig geladen ist,
012       mt.waitForAll();
013    } catch (InterruptedException e) {
014       //nothing
015    }
016    imagesize        = new Dimension();
017    imagesize.height = image.getHeight(this);
018    imagesize.width  = image.getWidth(this);
019 }
Listing 2.5: Vorbereitung der Spielsteine im Schiebepuzzle

Der eigentliche Ladevorgang ist ganz einfach und erfordert lediglich den Aufruf der Methode getImage. Diese erwartet als erstes Argument die Basisadresse des Bildes, in diesem Fall das mit getDocumentBase ermittelte Verzeichnis, aus dem die aktuelle HTML-Seite geladen wurde. Als zweiter Parameter wird der Name der Bilddatei übergeben, die hier durch Aufruf von getParameter aus dem Applet-Parameter src gewonnen wird.

Etwas aufwendig wird die Methode, um auf den Abschluß des Ladevorgangs zu warten. getImage geht davon aus, daß Bilder oftmals über langsame Netzwerkverbindungen geladen werden müssen und führt das Laden daher asynchron mit Hilfe eines eigenen Threads aus. Da wir am Ende der Methode die Größe des Bildes ermitteln müssen, um die Berechnung der Teilbilder auf den Spielsteinen korrekt durchführen zu können, muß das Programm warten, bis das Bild vollständig geladen ist. Dazu instanziert es ein Objekt der Klasse MediaTracker, das in der Lage ist, den Ladevorgang eines oder mehrerer Bilder durch Aufruf von waitForAll zu überwachen. Nach Abschluß des Ladevorgangs wird eine Ausnahme vom Typ InterruptedException gesendet, nach der das Programm fortfährt. Anschließend wird das fertige Bild in der Instanzvariablen image abgelegt.

Nach dem Laden des Bildes wird durch Aufruf von randomizeField die Anordnung der Spielsteine durcheinandergebracht. Die Spielsteine werden durch das zweidimensionale Array aFields repräsentiert, das eine Größe von 4 mal 4 Elementen hat. Arrays sind in Java Objekte, die wie andere Objekte dynamisch instanziert werden müssen. Unser Programm hat dies in init mit Hilfe der folgenden Anweisung erledigt:

aFields     = new int[4][4];

In jedem Element von aFields steht einer der Werte 0 bis 15, der anzeigt, welches der 16 Teilbilder an der entsprechenden Position angezeigt werden soll. Das letzte Bild (also Nummer 15) repräsentiert die Lücke, die von den Anzeigeroutinen als schwarzes Rechteck dargestellt wird. randomizeField sortiert zunächst das Array, indem die Zahlen von 0 bis 15 in aufsteigender Reihenfolge hineingeschrieben werden. Anschließend werden die Steine vermischt, indem zwanzigmal nacheinander je zwei zufällig ausgewählte Elemente miteinander vertauscht werden:

001 /**
002  * Mischt die Steine auf dem Spielfeld.
003  */
004 private void randomizeField(boolean unordered)
005 {
006    int i, j, k, tmp;
007 
008    //Zuerst sortieren...
009    for (i = 0; i <= 15; ++i) {
010       aFields[i / 4][i % 4] = i;
011    }
012    //Dann mischen...
013    if (unordered) {
014       Random rand = new Random(System.currentTimeMillis());
015       for (i = 0; i < 20; ++i) {
016          j = Math.abs(rand.nextInt()) % 16;
017          k = Math.abs(rand.nextInt()) % 16;
018          tmp = aFields[j / 4][j % 4];
019          aFields[j / 4][j % 4] = aFields[k / 4][k % 4];
020          aFields[k / 4][k % 4] = tmp;
021       }
022    }
023 }
Listing 2.6: Mischen der Spielsteine im Schiebepuzzle

Zufallszahlengeneratoren in Java sind Objekte der Klasse Random. Der Zufallszahlengenerator, der in diesem Fall mit der aktuellen Systemzeit initialisiert wird, ist in der Lage, positive und negative Zufallszahlen für Ganz- und Fließkommazahlen zu erzeugen.

Die Klasse Math stellt eine Reihe von Methoden zur Verfügung, die bei der Verarbeitung von numerischen Werten hilfreich sind. Sie besitzt überwiegend Klassenmethoden, die ohne zugeordnetes Objekt aufgerufen werden können. Klassenmethoden sind das Pendant zu globalen Funktionen anderer Programmiersprachen, müssen aber immer zusammen mit dem Namen der Klasse, in der sie deklariert wurden, aufgerufen werden.

 Tip 

Weiterführende Informationen zum Laden und Anzeigen von Bildern finden sich in Kapitel 24, dort wird auch das Konzept der Klasse MediaTracker genau erläutert. Die Behandlung von Ausnahmen und das Exception-Konzept werden in Kapitel 9 vorgestellt. Die Instanzierung von Arrays wird in Kapitel 4 behandelt und die Methoden der Klasse Math stammen aus Kapitel 7, in dem auch die Verwendung von Klassenmethoden beschrieben wird. Der Zufallszahlengenerator und die Methoden der Klasse System werden in Kapitel 12, das sich mit Utility-Klassen beschäftigt, vorgestellt.

 Hinweis 


 Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com