module Graphics.Gloss.Interface.FRP.Yampa
(playYampa, InputEvent)
where
import Control.Monad (when)
import Data.IORef (newIORef, readIORef,
writeIORef)
import FRP.Yampa (Event (..), SF, react,
reactInit)
import Graphics.Gloss (Color, Display, Picture,
blank)
import qualified Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game (playIO)
import qualified Graphics.Gloss.Interface.IO.Game as G
type InputEvent = G.Event
playYampa :: Display
-> Color
-> Int
-> SF (Event InputEvent) Picture
-> IO ()
playYampa display color frequency mainSF = do
picRef <- newIORef blank
handle <- reactInit
(return NoEvent)
(\_ updated pic -> when updated (picRef `writeIORef` pic) >> return False)
mainSF
let delta = 0.01 / fromIntegral frequency
toPic = (const $ readIORef picRef)
handleInput = (\e t -> react handle (delta, Just (Event e)) >> return (t + delta))
stepWorld =
(\d t -> let delta' = realToFrac d - t
in if delta' > 0
then react handle (delta', Just NoEvent) >> return 0.0
else return (-delta'))
playIO display color frequency 0 toPic handleInput stepWorld