Sharing Ultra Smooth Movement Script

A tick based script I created that took months to get it ultra smooth on any fps with vsync on/off. The problem I discover was that delta time in openfl is not 'consistent or move the numbers up and down smoothly"

private var currentTime:Float = Lib.getTimer();
private var cacheTime:Float = Lib.getTimer();
private var deltaTime:Float = 0;
private var timeRemainder:Float = 0;
private var timePassed:Float = 0;
private var gameSpeed:Float = (1.0 / 60) * 1000; // formula to convert to ms (frame / 60 FRAME PER Seconds) * 1000 ms
private var maxGameSpeedSkip:Float = (3.0 / 60) * 1000;
public function update(e:Event){
		var display = Lib.application.window.displayMode;
        var refreshRate = display.refreshRate;
		stage.frameRate = refreshRate;//set the framerate to the screen hertz speed
		currentTime = Lib.getTimer();
		deltaTime = lerp(deltaTime,Math.min((1/stage.frameRate) * 1000,currentTime - cacheTime),.5);//cap the delta time to hertz refresh rate so the delta is smooth. Also lerp 50% for ultra smoothness
		cacheTime = currentTime;
		
		timePassed += deltaTime;
		if (timePassed > maxGameSpeedSkip) timePassed = maxGameSpeedSkip;
		while (timePassed >= gameSpeed){
			updateGame();//update your game code here
			timePassed -= gameSpeed;
		}
		timeRemainder = timePassed / gameSpeed;// use this for movement interpolation
		dispatchEvent(new Event("RENDER_UPDATE", true));
		stopAllMovieClips();
}
function lerp(a:Float, b:Float, f:Float)
	{
		return a * (1.0 - f) + (b * f);
	}

Have fun!

1 Like

To smooth out any xyz movement. It’s
var smoothX:Float = lerp(previousXTick,currentXTick, timeRemainder);
on “RENDER_UPDATE” event