5 | import Control.Monad.State
7 | import IdrisGL.Picture
8 | import IdrisGL.DataType
10 | import IdrisGL.SDL.SDL_event
11 | import IdrisGL.SDL.SDL_video
12 | import IdrisGL.SDL.SDL_render
13 | import IdrisGL.SDL.SDL_surface
14 | import IdrisGL.SDL.SDL_timer
27 | : (window : Display)
28 | -> (bgColor : Color)
31 | -> (w2p : a -> Picture)
32 | -> (ew2w : Eve -> a -> a)
33 | -> (tw2w : Double -> a -> a)
35 | play window bgColor tpf w w2p ew2w tw2w = do
36 | win <- createWin window
37 | ren <- createRenderer win
45 | loop : Renderer -> Win -> Event -> a -> Double -> IO ()
46 | loop ren win e world lastTime =
47 | if !getSecondsTicks - lastTime < tpf
48 | then loop' ren win e world lastTime
50 | setRenderDrawColor ren bgColor
52 | loadPicture (w2p world) ren win
54 | currT <- getSecondsTicks
55 | let newW = tw2w currT world
56 | loop' ren win e newW currT
58 | loop' : Renderer -> Win -> Event -> a -> Double -> IO ()
59 | loop' ren win e w lastTime with (eveType e)
60 | loop' _ _ _ _ _ | E_QUIT = pure ()
61 | loop' ren win e w lastTime | other = loop ren win e (ew2w other w) lastTime
76 | : (window : Display)
77 | -> (bgColor : Color)
80 | -> (w2p : StateT a IO Picture)
81 | -> (e2w : Eve -> StateT a IO ())
82 | -> (t2w : Double -> StateT a IO ())
84 | playStateT window bgColor tpf state w2p e2w t2w = do
85 | win <- createWin window
86 | ren <- createRenderer win
88 | loop state ren win e 0
94 | loop : a -> Renderer -> Win -> Event -> Double -> IO ()
95 | loop st ren win e lastTime =
96 | if !getSecondsTicks - lastTime < tpf
97 | then loop' st ren win e lastTime
99 | setRenderDrawColor ren bgColor
101 | (st, pics) <- runStateT st w2p
102 | loadPicture pics ren win
104 | currT <- getSecondsTicks
105 | st <- execStateT st (t2w currT)
106 | loop' st ren win e currT
108 | loop' : a -> Renderer -> Win -> Event -> Double -> IO ()
109 | loop' st ren win e lastTime with (eveType e)
110 | loop' _ _ _ _ _ | E_QUIT = pure ()
111 | loop' st ren win e lastTime | other = do
112 | st <- execStateT st (e2w other)
113 | loop st ren win e lastTime