Added compatibility function for Gloss and Yampa
This commit is contained in:
parent
d8c1579147
commit
e2bd9325f6
58
Graphics/GlossUtils.hs
Normal file
58
Graphics/GlossUtils.hs
Normal file
|
@ -0,0 +1,58 @@
|
|||
module Graphics.GlossUtils (playYampa, InputEvent) where
|
||||
|
||||
-- A utility function to connect the FRP library Yampa to the
|
||||
-- graphics library Gloss, from the library yampa-gloss
|
||||
|
||||
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 ::
|
||||
-- | The display method
|
||||
Display ->
|
||||
-- | The background color
|
||||
Color ->
|
||||
-- | The refresh rate, in Hertz
|
||||
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
|
Loading…
Reference in a new issue