6
1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

Embed Size (px)

Citation preview

Page 1: 1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

1

Animation(Doublepuffering)

Vorlesung: Datenverarbeitung Grundlagen 3

Fachbereich II - Mathematik

Rolf Heitzenröder

Page 2: 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.

Page 3: 1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

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;

Page 4: 1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

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);

Page 5: 1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

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.

Page 6: 1 Animation (Doublepuffering) Vorlesung: Datenverarbeitung Grundlagen 3 Fachbereich II - Mathematik Rolf Heitzenröder

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.