module Animate where
import Graphics.UI.GLUT (GLuint)
import Control.Monad.Loops
import Control.Monad
import Data.Array
import Data.IORef
import Control.Concurrent.MVar
import Data.Convertible
import Data.Time.Clock
import FRP.Yampa
import qualified Render as Render
import BasicTypes
import Object
import AL
import States
import Global
import GameLoop
animate' parm graphData rh timeState frameCounter newInput = do
t <- getCurrentTime
let t' = convert t :: Double
t0 <- readIORef timeState
writeIORef timeState t'
inp <- input' parm graphData (t'-t0) frameCounter newInput True
react rh inp
animateInit param graphData dt timeState frameCounter objs = do
(dt, Just gi0) <- input dt timeState frameCounter True
reactInit (return gi0)
(output' param graphData)
(gameLoop param
(AL $ map (\(id, o, oo) -> (id, oo)) objs)
(AL $ map (\(id, o, oo) -> (id, o)) objs))
input' :: Param ->
GraphicsData ->
Time ->
IORef Int ->
MVar [RSEvent] ->
Bool ->
IO (DTime, Maybe GameInput)
input' parm graphData dt counter newInput b = do
maybeEvents <- tryTakeMVar newInput
putMVar newInput []
count <- readIORef counter
let events = case maybeEvents of
Nothing -> []
Just es -> es
writeIORef counter (count + 1)
-- putStrLn . show $ events
return (dt, Just (dt * (fromIntegral count), events))
output' :: (Eq a, Num a) => --(Eq a, Num i, Num a, Ix i) =>
Param
-> GraphicsData
-> t
-> t1
-> AL a ObjOutput
-> IO Bool
output' param graphData rh _ oal@(AL oos) = do
Render.render param (map (ooObsObjState . snd) oos) graphData
let ol = (AL.!) oal 1
when (((fst . oosGameState . ooObsObjState) ol) == GSQuit) $ putStrLn "Quit"
return (((fst . oosGameState . ooObsObjState) ol) == GSQuit)
-- neuer Kram endet hier
-- reactimation IO ----------
input :: Time -> IORef Double -> IORef Int -> Bool -> IO (DTime, Maybe GameInput)
input tInit stateTime counter _ = do
count <- readIORef counter
writeIORef counter (count + 1)
let events = [] -- events <- unfoldWhileM (/= SDL.NoEvent) SDL.pollEvent
t1 <- getCurrentTime
let t1' = convert t1 :: Double
t0 <- readIORef stateTime
writeIORef stateTime t1'
return (t1'-t0, Just (t1'-tInit, events))