Upload
brunhild-wichterman
View
104
Download
2
Embed Size (px)
Citation preview
1
Animation(Doublepuffering)
Vorlesung: Datenverarbeitung Grundlagen 3
Fachbereich II - Mathematik
Rolf Heitzenröder
An
imatio
n
2
EinführungIn Java ist es möglich sogenannte Animationen zu erstellen.
In einer möglichen Vorgehensweise wird schrittweise die Position des Bildes (Image) versetzt. Dies wird auch „Cutout-Animation“ genannt.
Eine zweite Möglichkeit ist, eine Folge von Bilder in der richtigen Reihenfolge nacheinander darzustellen. Diese Methode nennt man auch „Cartoon-Stil“, es ist die gleiche Vorgehensweise wie bei einem Zeichentrickfilm.
An
imatio
n
3
Durch die einfache Darstellung der Bilder auf der Zeichenfläche entsteht ein unschöner Effekt. Die Animation flackert. Das Flackern hat folgende Ursache:
Vor dem Aufruf der paint - Methode wird der Hintergrund der Animation gelöscht. D.h. der ganze Bereich wird in der Hintergrundfarbe neu gezeichnet.
Die gebräuchlichste Methode das Flackern zu um gehen ist das
Implementieren einer Doppelpufferung:DoubleBuffering arbeitet mit mehreren verschiedenen Graphic - Objekten.
Deklarieren der Bilder und des Graphickontext
Image bild;
BufferedImage offBild;offBild = new BufferedImage(200,200, BufferedImage.TYPE_INT_RGB);
Graphics2D offGraphic;
An
imatio
n
4
Zuerst wird ein Graphik-Objekt des Offscreen-Bildes, offBild erstellt.
offGraphic = offBild.createGraphics();
In diesem Graphik-Kontext werden dann die notwendigen Operationen ausgeführt.
Man kann zum Beispiel, die neue Positon des Bildes bzw. ein neues Bild dort einfügen.
offGraphic.drawImage(bild[i], (offBild.getWidth()/2)-(bild[i].getWidth(this)/2), (offBild.getHeight()/2)-(bild[i].getHeight(this)/2), this);
Das Image-Array bild[] beinhaltet für die Cartonn-Animation alle Images die für die Darstellung benötigt werden.
Die nächsten zwei Parameter sind die Position, wo das Image zuerst im Graphik-Kontext des Offscreen-Bildes liegt
Nach dem kompletten malen (aufbereiten des unsichtbaren Graphik-Kontext) wird das Image mit drawImage(offBild, x, y,
ImageObserver);
An
imatio
n
5
auf den Graphik-Kontext des Panel kopiert.
Dies kann deshalb funktionieren, da der Graphik-Kontext praktisch / bildlich gesehen mit dem zugehörenden Image immer noch verbunden ist. Alles was mit dem Graphik-Kontext (Objekt) geschieht wird auch auf dem Image vollführt.
Das Praktische dabei ist, dass der Graphik-Kontext des Image und der des Panel vom gleichen Objekt-Typ sind. Sie sind also mit einander Kompatibel. So kann man das veränderte Offscreen-Image (in dem ja das normale Image eingefügt worden ist bzw. die Postion verändert wurde) in dem Panel schließlich an sehen.
An
imatio
n
6
BufferdImageIm JDK 1.2 gibt es die Klasse (Programmierhandbuch und Referenz, von Stefan Middendorf, Reiner Singer)
BufferedImage, die direkt ein Offscreen-Image repräsentiert. Bei einem createImage()-Aufruf mit ist das zurückgelieferte Image-Exemplar vom Typ BufferedImage. Das ist deshalb möglich, da BufferedImage von Image abgeleitet ist. java.lang.Object
-> java.awt.Image -> java.awt.image.BufferedImage
Ein BufferedImage kann man auch direkt mit Hilfe des new-Operators angelegen:
BufferedImage b_image = new BufferedImage(int x, int y, BufferedImage.TYPE_INT_RGB);
Mit folgender Zeile erhält man das Graphics-Objekt des oben erstellten Bildes:
Graphics b_imageGraphics = b_image.getGraphics();
In diesen Grafikkontext wird auf dieselbe Weise gezeichnet, wie in den Grafikkontext, der paint()-Methode übergeben wird.