# Langsame Beschleunigung darstellen



## Doopy (23. Dez 2013)

Hallo zusammen,

ich möchte bei meinem 2D-Spiel eine Bewegung möglicht flüssig beschleunigen lassen, sodass man gar nicht merkt dass sich die Geschwindigkeit ändert. Das Problem ist, dass ich ganzzahlige Werte(Pixel) für die Strecken pro Frame angeben muss, und dann merkt man deutlich den Sprung von einem Pixel pro Frame auf zwei. Versucht habe ich bereits die Framerate kontinuierlich zu steigern, doch das sah wirklich unschön aus(Ruckler).
Habt ihr evtl Tipps für mich?

MfG


----------



## eMmiE (24. Dez 2013)

Wenn es dein Spiel ist, dann würde ich die Schrittlänge auf doubles ändern und auch die Positionen, somit hast du dann mehr Schrittmöglichkeiten.
Du musst das eben vor dem Malen runden (-> (int)(zahl +0.5))

Eine andere, kompliziertere Methode ist es, dein Spiel Multithreaded zu machen (wenn es noch nicht ist)
Du hast dann einfach einen Hauptthread, der möglichst wenig Befehle ausführt und somit schnell bearbeiten kann. Eine Idee wäre vllt. auch ein repaint-Thread, der einfach nur malt, damit der Hauptthread nicht so belastet wird.

Lass dir auf jeden Fall mal die Berabeitungszeiten mithilfe von System.currentTimeMillis() ausgeben und schau, wo dein Programm am Längsten braucht

Gruß eMmiE

P.S.: Schöne Weihnachten


----------



## Gucky (24. Dez 2013)

rne meinte einmal, dass systemTimeMillis() nicht gut sei und das die nanos besser seien. Nachzulesen hier.


----------



## Doopy (25. Dez 2013)

Wenn ich die Schrittlänge in doubles angebe, und die dann anschließend runde habe ich dann aber immer noch die ganzzahligen Werte... Ich kann zwar angeben 1,4 Pixel pro Frame, gezeichnet werden dann aber immer noch 1/frame.

Mit dem zweiten Thread meinst du einen, der seine eigene Sleeptime hat die dann verändert werden kann? Aber wie steht das dann im Bezug zum Hauptthread? Kommt es nicht zu Komplikationen wenn zu unterschiedlichen Zeitpunkten gerechnet und gezeichnet wird?

MfG


----------



## eMmiE (25. Dez 2013)

Ja klar kannst du nicht 1,4 Pixel malen, aber wie sollst du das denn sonst machen?
Du kannst dir natürlich einen Monitor höherer uflösung kaufen und dann imer einen Pixel nach dem anderen laufen, aber das ändert eigentlich gar nichts am Prinzip...
Ein Bildschirm besteht aus Pixeln und du musst dich danach richten!:bae:

Wenn du jetzt aber doubles im Hintergrund benutzt, dann kannst du dem Nutzer viel eher suggerieren, dass sich die Spielfigur/wasauchimmer flüssig bewegt, weil der "Sprung" von 1 Pixel Schrittlänge zu 2 Pixel Schrittlänge usw. immer anders erscheint. bei 0.5 Schrittlänge schon nach 2 Schritten, bei 0.25 Schrittlänge nach 4 usw.

Eine andere Idee, die mir gerade kommt ist, dass man vllt. die Linien aufteilen sollte.
Wenn die Position (erstmal 1-D) sich zwischen Pixeln befindet, dann kann man ja den Pixel, der links von der Position ist mit einem Grauton, dessen Helligkeit der Entfernung der Position zu dem Pixel, wo er gemalt wird, entsprechend eingestellt ist, einfärben und suggeriert somit, dass sich die Linie ohne Rundung weiterbewegt. Das wird allerdings ein bisschen kompliziert umzusetzen 

Viel Spaß

Gruß eMmiE

P.S.: Frohen ersten Weihnachtsfeiertag


----------



## Doopy (25. Dez 2013)

Ja das mit den Pixeln hab ich ja genauso gemeint 

Und das mit den double Koordinaten und Schrittlängen hab ich jez auch verstanden, hatte nur einen Denkfehler, die Variablen bleiben ja immer doubles und werden nur kurz vor dem Zeichnen gerundet.
Hab das mal ausprobiert und es sieht super aus, danke 
Jetzt muss ich nur noch das repainten in einen separaten Thread verlagern...
Ich probiers mal und meld mich gleich


----------

