Wenn du es richtig geschmeidig haben willst musst du die Float-Positionen bestmöglich durch Int-Positionen approximieren. Also wenn ich z.B. 10x um 0.5 Pixel bewege nimmt man 0 1 0 1 0 1 0 1 0 1 und nicht (wie aktuell mit einfachem Abrunden) 0 0 0 0 0 0 0 0 0 0.
Klingt weeeesentlich schwieriger als es ist. Einfach einen Positionspuffer erzeugen in dem der "Rest hinter dem Komma" aufgehoben wird.
Global $aFloatPos = [0, 0]
$aFloatPos[0] += 5 * Sin(TimerDiff($t) / 1000) + 3 * Cos(TimerDiff($t) / 3000)
$aFloatPos[1] += 5 * Cos(TimerDiff($t) / 1000) + 3 * Sin(TimerDiff($t) / 7000)
$iTimer = TimerInit()
_ED2D_BitmapMove($hIMG, $hIMG2, Int($aFloatPos[0]), Int($aFloatPos[1]))
$iTime = (TimerDiff($iTimer) + $iTime * 19) / 20
$aFloatPos[0] -= Int($aFloatPos[0])
$aFloatPos[1] -= Int($aFloatPos[1])
Zu GDI+:
Das einzige was hier fehlt ist der VSync. Gäbe es eine Funktion (wie in D2D) die passend zur Bildfrequenz zeichnet (Es gibt leider keine mit bekannte Methode das in GDI+ zu fabrizieren), hätte man 90% Des Ruckelns abgeschafft, da man als Programmierer etwas aufpassen kann, dass das Skript die 60 oder 30 FPS schafft. (Bei niedrigeren Frameraten ist das Tearing eher Nebensache).
Man kann mit D2D (manche, viele, alle, keine ?) Bitmaps aus GDI+ (via Scan0 geht "meistens", da man hier das RAM kopieren kann... können sollte.... hust.... Pixelformatfehler obwohl nur Integer im RAM liegen !?) kopieren und dann als D2D Bitmap ins Fenster beamen, das habe ich an einigen Stellen bereits ausprobiert, eine allumfassend zufriedenstellende Lösung gibt es (von mir jedenfalls) noch nicht.
Edit: Das Problem ist nichtmal neu.... Das hab ich mir vor 3 Jahren schon gestellt. Inzwischen ist aber (dank eukalyptus und seinem D2D-Elan) wenigstens ein Ziel in Sicht
lg
M