# Langsame(re) Bewegungen / Animationen



## Luk10 (6. Jan 2012)

Grüße,

Ich probiere gerade ein bissche mit bewegten und/oder animierten 2D - Sprites herum.
Ich habe also ein BufferedImage[] mit vielen (40 in meinem konkreten Beispiel) Einzelbildern, die ich dann wie ein Daumenkino animiere. Die Images sind 50x50 Pixel, und die Zeichenoberfläche 400x300 groß.

Es funktioniert soweit alles sehr gut. Allerdings nur wenn ich eine Animation von [50ms / neues Image] bzw [50ms / Pixel in x und/oder y Richtung] habe. 
Ab einer "Geschwindigkeit von > 100 ms fängt die Bewegung an zu ruckeln bzw sie sieht nicht mehr flüssig aus. Genauso bei der Animation, wobei man hier mit mehr Einzel-Images entgegenwirken kann. Jedoch kann ich mein Bild nicht um 0,5 Pixel bewegen und mehr als 80 Einzelbilder ist ein riesiger Aufwand.

Ich will aber eine langsamere Bewegung / Animation meines Sprite (200-500 ms / Pixel, Image) flüssig umsetzten...
Kann mir jemand einen Tipp geben wie ich das auch ruckelfrei hinbekomme? Oder ist das schlichtweg nicht möglich?
Würde micht sehr über Hilfe freuen. Muss nichts konkretes sein sondern eher Ideen bzw Ansätze. 

Danke,
-Luk10-


----------



## Cola_Colin (6. Jan 2012)

Zur Animation: 
Hier kommst du wohl kaum daruum herum mehr Zwischenbilder darzustellen, wenn du nur alle 100ms ein neues Bild zeigst sind das 10 Bilder pro Sekunde > ruckelt eben...

Zur Bewegung:
Ähnliches Problem, wenn du nur 10mal pro Sekunde um einen Pixel nach rechts gehst, so sind das eben nur 10 Bilder die Sekunde und die kann dein Kopf noch recht gut auseinanderhalten. Hier würde ich es mit Kantenglättung versuchen. Beispiel:
X sei ein schwarzes Pixel, Y ein graues und O ein weißes pixel:

XOOOO
XYOOO
YXOOO
OXYOO
OYXOO

usw...

Praktisch der Unschärfefilter, den viele Spiele aktuell gerne mal anwenden, um alles ein bisschen flüssiger wirken zu lassen.


----------



## Luk10 (6. Jan 2012)

Hmhmhm ... danke erstmal für deine Antwort.

Animation ... gut da werde ich evt. noch weiter mit mehr Bildern rumprobieren.
Zum Thema Kantenglättung:

Ich verwende bereits halbtransparente Pixel in den .png Datein die ich dann als Images verwende ... Hat des dann überhaupt noch einen Effekt die Kanten nochmal zu Glätten? Wie kann man sowas bewerkstelligen?

Danke,
-Luk10-


----------



## Cola_Colin (6. Jan 2012)

Mit Java2D kannst du sowas probieren:


```
RenderingHints renderQuality;

        renderQuality = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

            renderQuality.put(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);

            renderQuality.put(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

            renderQuality.put(RenderingHints.KEY_FRACTIONALMETRICS,
                    RenderingHints.VALUE_FRACTIONALMETRICS_ON);

            renderQuality.put(RenderingHints.KEY_DITHERING,
                    RenderingHints.VALUE_DITHER_ENABLE);

            renderQuality.put(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            ((Graphics2D) g).addRenderingHints(renderQuality);

           // nun auf g rumzeichnen.
```

Den Effekt verstärken kann man, indem man erst alle Sprites einzeln mit Kantenglättung auf ein BufferedImage zeichnet und diese gesamte Bild dann nocheinmal mit Kantenglättung in die Sichtfläche des Spielers zeichnet.

Ob diese Glättung nun ausreicht, um dein Problem zu lösen, weiß ich nicht, für den Zweck habe ich das nie verwendet.

Zur Transparenz: wenn du die Bilder zum Rand hin immer transparenter machst, dann dürfte das einen ähnlichen glättenden Effekt haben. Wenn sie dagegen gleichmäßig überall transparent sind, bringt es nichts. Denke ich...


----------

