# Einfache Animationen darstellen



## BigmasterDenis (21. Dez 2006)

Hi Leute!

Ich habe ein paar png-BIldchen, die ich gerne nach einander anzeigen lassen würde, damit eine Art Animation entsteht. Ich gehe dabei so vor, dass ich alle paar ms ein neues Bild mit g.drawImage(bild, x, y) zeichne. Das Problem hierbei ist natürlich, dass die alten Bilder auch noch da sind, welche vor dem erneutem Zeichnen erstmal entfernt werden müssen. Das Entfernen habe ich mit g.clearRect(x,y) versucht. Das klappt zwar, jedoch passiert das Löschen und das Neuzeichnen nicht schnell genug, sodass die Animation zwar läuft aber stark "flimmert". Um die Bilder zu laden habe ich die Klasse Image verwendet.

Nun frage ich mich, wie man das Bildaktualisieren effizienter hinkriegt !? Was ist die grundlegende Vorgehensweise bei Animationen ? 


thanx4help

Gruß

Denis D.


----------



## Wildcard (21. Dez 2006)

Benutzt du AWT oder Swing? Swing ist per default doppelt gepuffert, sollte also nicht flimmern.
Anstatt clearRect solltest du super.paint bzw. paintComponent aufrufen.


----------



## BigmasterDenis (21. Dez 2006)

ich zeichne direkt ins JFrame (Canvas nützt auch nix)... also nehme ich an, dass ich Swing benutze  :lol: 

Wie kann man sich das mit super.paint bzw. paintComponent vorstellen? Kannst du ein Codestückhen rüberwandern lassen?


----------



## Wildcard (21. Dez 2006)

Zeichne besser mit einer JComponent.
Überschreib dann paintComponent:


```
public void paintComponent(Graphics g)
{
        super.paintComponent(g);
        //dein Code
}
```


----------



## LoN_Nemesis (21. Dez 2006)

Ich denke mal, dass du einfach zu schnell zeichnen willst. Versuch mal so 20 ms rum, das ist auf jeden Fall schnell genug. Ansonsten poste mal etwas Code zum anschauen.


----------



## BigmasterDenis (21. Dez 2006)

Ne, ne ich will nicht zu schnell zeichnen. Mit paar ms meinte ich eigentlich so um die 70 ms    .

Ich habe es jetzt mit dem Code von Wildcard versucht. Das Flimmern ist nun weg. Thax@Wildcard. 

Um super.paintComponent(g); aufzurufen musste ich allerdings ein JPanel erstellen und in dieses Panel zeichnen, weil das JFrame selbst paintComponent(g) nicht unterstützt. Als Nebeneffekt habe ich nun ein weißes Rechteck um meine Figur...  :?  Aber das kriege ich bestimmt noch irgendwie weg.


----------



## Wildcard (22. Dez 2006)

Das liegt daran das ein JFrame keine Component ist.
Mach einfach ein setBorder(null) oder nimm statt des Panels eine JComponent wie ich dir empfohlen habe.


----------



## L-ectron-X (22. Dez 2006)

Ich will nicht klug kack'n, aber auch ein JFrame ist eine Component...
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JFrame.html
Vererbungshirarchie gleich ganz oben. :wink:


----------



## Wildcard (22. Dez 2006)

Korrektur: keine *J*Component


----------



## L-ectron-X (22. Dez 2006)

Ich glaub' Beni hat mal geschrieben, er habe keinen Unterschied zwischen JComponent und JPanel finden können und benutzt aus Faulheit, weil der Name kürzer ist, JPanel. Wenn das so ist, wie Beni geschrieben hat, kann er auch sein JPanel nehmen.


----------



## Wildcard (22. Dez 2006)

Also ein Unterschied sollte schonmal die Border sein.


----------



## Roar (22. Dez 2006)

außer den hilfskonstruktoren und der tatsache dass JComponent abstract ist gibts wirklich keinen unterschied zwischen JPanel und JComponent - JPanel hatauch standardnäßig keinen Border ???:L


----------



## Wildcard (22. Dez 2006)

Roar hat gesagt.:
			
		

> JPanel hatauch standardnäßig keinen Border ???:L


Du hast recht. War eigentlich der Meinung das installiert eine EmptyBorder  ???:L 
Schon seltsam das die beiden de facto identisch sind   :bahnhof:


----------

