package com.actionsnippet.animation{ import flash.display.DisplayObject; import flash.utils.getTimer; import flash.events.*; public class QuickFRIM extends EventDispatcher { public static const STEP:String="step"; public static const RENDER:String="render"; private var _main:DisplayObject; private var _step:Event; private var _render:Event; private var _currTime:Number=0; private var _elapsedTime:Number=0; private var _prevTime:Number=0; private var _accumulator:Number=0; private var _offset:Number = 0; public var timeStep:Number; public var totalTimeSteps:Number=0; public var stepsPerFrame:int=0; public var disable:Boolean = false; public function QuickFRIM(main:DisplayObject, hz:Number = 60.0) { timeStep = 1.0 / hz; _main = main; _step = new Event(STEP); _render = new Event(RENDER); } public function start():void { _offset = getTimer(); _main.addEventListener(Event.ENTER_FRAME, onRender, false, 0, true); } public function stop():void { _main.removeEventListener(Event.ENTER_FRAME, onRender); } // based off this thread https://developer.playfirst.com/node/860 private function onRender(evt:Event):void { _currTime = getTimer() - _offset; _elapsedTime = (_currTime - _prevTime) * 0.001; _prevTime = _currTime; if (_elapsedTime > 0.25) { _elapsedTime = 0.25; } _accumulator += _elapsedTime; stepsPerFrame = 0; if (!disable){ while (_accumulator >= timeStep) { dispatchEvent(_step); _accumulator -= timeStep; totalTimeSteps++; stepsPerFrame++; } }else{ dispatchEvent(_step); totalTimeSteps++; stepsPerFrame++; } dispatchEvent(_render); } } }