|
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 } |
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 } |
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. |
![]() |
|
![]() |
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. |
![]() |
|
![]() |
|
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com |