module Gamgine.Engine where import Graphics.UI.GLFW (getTime) import Control.Monad.State (MonadIO, liftIO) import Control.Applicative ((<$>)) import Data.Maybe (fromMaybe) mkUpdateLoop :: (MonadIO m) => Int -> Int -> m a -> (Double -> m (Double, Double)) mkUpdateLoop ticksPerSecond maxFrameSkip update = \nextFrame -> loop nextFrame 0 where loop nextFrame skippedFrames = do time <- liftIO (fromMaybe nextFrame <$> getTime) if time > nextFrame && skippedFrames < maxFrameSkip then do update loop (nextFrame + skipTicks) (skippedFrames + 1) else do let interpol = interpolation time nextFrame skipTicks return (nextFrame, interpol) interpolation time nextFrame skipTicks = (time - skipTicks - nextFrame) / skipTicks skipTicks = 1 / (fromIntegral ticksPerSecond :: Double)