2 | module IdrisGL.Simulate
4 | import Control.Monad.State
6 | import IdrisGL.Picture
7 | import IdrisGL.DataType
9 | import IdrisGL.SDL.SDL_event
10 | import IdrisGL.SDL.SDL_video
11 | import IdrisGL.SDL.SDL_render
12 | import IdrisGL.SDL.SDL_surface
13 | import IdrisGL.SDL.SDL_timer
25 | : (window : Display)
26 | -> (bgColor : Color)
29 | -> (m2p : (a -> Picture))
30 | -> (m2m : (Double -> a -> a))
33 | simulate window bgColor tps m m2p m2m = do
34 | win <- createWin window
35 | ren <- createRenderer win
43 | loop : Renderer -> Win -> Event -> a -> Double -> IO ()
44 | loop ren win e model lastTime =
45 | if !getSecondsTicks - lastTime < tps
46 | then loop' ren win e model lastTime
48 | setRenderDrawColor ren bgColor
50 | loadPicture (m2p model) ren win
52 | currT <- getSecondsTicks
53 | let newM = m2m currT model
54 | loop' ren win e newM currT
56 | loop' : Renderer -> Win -> Event -> a -> Double -> IO ()
57 | loop' ren win e m lastTime with (eveType e)
58 | loop' _ _ _ _ _ | E_QUIT = pure ()
59 | loop' ren win e m lastTime | _ = loop ren win e m lastTime
71 | : (window : Display)
72 | -> (bgColor : Color)
75 | -> (m2p : StateT a IO Picture)
76 | -> (m2m : Double -> StateT a IO ())
79 | simulateStateT window bgColor tps state m2p m2m = do
80 | win <- createWin window
81 | ren <- createRenderer win
83 | loop state ren win e 0
89 | loop : a -> Renderer -> Win -> Event -> Double -> IO ()
90 | loop st ren win e lastTime =
91 | if !getSecondsTicks - lastTime < tps
92 | then loop' st ren win e lastTime
94 | setRenderDrawColor ren bgColor
96 | (st, pics) <- runStateT st m2p
97 | loadPicture pics ren win
99 | currT <- getSecondsTicks
100 | st <- execStateT st (m2m currT)
101 | loop' st ren win e currT
103 | loop' : a -> Renderer -> Win -> Event -> Double -> IO ()
104 | loop' st ren win e lastTime with (eveType e)
105 | loop' _ _ _ _ _ | E_QUIT = pure ()
106 | loop' st ren win e lastTime | _ = loop st ren win e lastTime