Animation


... [ Seminar WWW und JAVA] ... [ Applets und das Java AWT ] ... [ Threads ] ...


Übersicht: Animation


Einleitung

Animation entsteht z.B., indem die Koordinate einer Linie verändert wird oder die Koordinate eines Bildes.

Quellcode

Für die Animation muß innerhalb des Applets immer wieder neu gezeichnet werden, d.h. pain() wird mehrfach aufgerufen. Um das System bei der Steuerung der Bildschirmausgabe nicht zu überlasten (s. voriges Kapitel), wird der Appletablauf durch einen Thread (s. nächstes Kapitel) geregelt. Dieser Thread ist ein eigener Prozeß, der einige Zeit angehalten wird, um paint() genug Zeit zur vollständigen Abarbeitung zu überlassen und, um das System nicht mit paint()-Aufrufen zu überfluten.

Die abstrakte Klasse Graphics stellt u.a. Methoden zum Zeichnen von Linien und Flächen zu Verfügung. Bei Flächen werden fast ausschließlich die Koordinaten der linken oberen Ecke und die Breite und Höhe als Parameter übergeben - auch beim Zeichnen eines Kreises!

Neben selbstgezeichneten Bildern kann Java auch bereits erstellte Bilder darstellen. In diesem Kapitel wird u.a. demonstriert, wie eines dieser Bilder geladen und auf einfache Weise mit Sound hinterlegt wird. Werden mehrere Bilder nacheinander - z.B. durch eine Schleife - aufgerufen, können sie wie ein "Daumenkino" angezeigt werden.

Eine flüssige Animation sollte sich ruckelfrei über einen komplexen Hintergrund bewegen können. Durch einfaches Löschen und Zeichnen von Bildern kann ein Flackern entstehen. Mit Double-Buffering und Clipping kann dieses Flackern verhindert werden.

Quellcode


Clipping

Clipping ist ein Verfahren, bei dem die Grafikausgabe beschleunigt werden kann, da nur ein kleiner Ausschnitt auf dem Applet neu gezeichnet wird und nicht das gesamte Bild. Dieser Bereich wird durch ein Clippingrechteck bestimmt.

Durch den Aufruf der Methode public abstract void clipRect (int x, int y, int width, int heigth) aus der Klasse Graphics kann dieses Rechteck festgelegt werden. Die paint()-Methode wird danach explizit aufgerufen und das benutzte Graphics-Objekt als Parameter übergeben. Die paint()-Methode weiß somit, auf welchen Bereich sie das Zeichnen beschränken soll.

Um das Clipping sichtbar zu machen, wird vor dem expliziten Aufruf von paint() die Farbe geändert. Durch Klicken mit der Maus über dem Appletbereich wird das Neuzeichen aktiviert.

Quellcode

Quellcode


Bilder und Sound

Mit Java ist es sehr einfach, Bilder und Sound in ein Programm zu integrieren. Unterstützt werden ".gif" und ".jpg" Bilder sowie ".au" Audioclips.

Für die Darstellung eines Bildes wird ein Image-Objekt angelegt, das jedoch nicht direkt instanziert werden kann, da Image eine abstrakte Klasse ist. Ein Image-Objekt wird durch den Aufruf von getImage() ausApplet angelegt. Zum Anzeigen des Bildes enthält die Klasse Graphics die Methode drawImage().

AudioClip ist ebenfalls eine abstrakte Klasse, die z.B. durch getAudioClip() instanziert werden kann. Zum Abspielen des Sounds enthält Applet die Methode play().

Quellcode Das dazugehörige Beispiel wird beim Vergleich im folgenden Unterkapitel benutzt.


MediaTracker

Die Klasse MediaTracker unterstützt das Laden der Bilder. Mit einem Objekt dieser Klasse kann z.B. die Ausgabe von Bildern blockiert werden, bis alle Bilder im Hintergrund gespeichert sind. Tritt ein Fehler beim Laden der Bilder auf, könnte dieser in der Statuszeile ausgegeben werden. Mit den Methoden addImage(name,id)und waitForID(id) kann z.B. auf das Laden eines Bildes gewarten werden, um es dann zusammen mit einem Sound auzuzeigen.

Quellcode

Laden mit MediaTracker im Vergleich zum einfachen Laden

Werden die gewünschten Bilder nicht einzeln, sondern zusammen von MediaTracker registriert, kann dieser versuchen, die Bilder parallel herunterzuladen, was bei langen Netzwerkverbindungen sehr nützlich sein kann. Mit waitForAll() wird dann das erste Bild erst gezeigt, wenn alle Bilder vorhanden sind, wodurch die Ausgabe erheblich verzögert werden kann. Dafür flackern die ersten Bilder aber nicht und erscheinen auch nicht nur teilweise auf dem Bildschirm.

Das erste Applet im nächsten Kapitel benutzt waitForAll().


Double-Buffering

Double-Buffering ist ein Mechanismus, der eine Zeichnung nicht direkt auf dem Bildschirm ausgibt, sondern erst in einen Puffer zeichnet. Dieser Puffer ist ein Bild, das sich auf dem Bereich der Grafikkarte befindet, das nicht angezeigt wird. Ist das Bild komplett, kann es in den sichtbaren Bereich umkopiert werden.

Da das Kopieren wesentlich schneller durchgeführt werden kann als das Zeichnen, eignet sich diese Technik besonders gut für aufwändige Darstellungen.

Quellcode

Für Double-Buffering wird die Klasse Component sowie die Schnittstelle Image benötigt. In diesem Fall wird ein Image-Objekt durch create.Image() angelegt.


... [ Seminar WWW und JAVA] ... [ Applets und das Java AWT] ... [ Animation ] ... [ Threads ] ...