summaryrefslogtreecommitdiffstats
path: root/HTanks.hs
diff options
context:
space:
mode:
Diffstat (limited to 'HTanks.hs')
-rw-r--r--HTanks.hs36
1 files changed, 17 insertions, 19 deletions
diff --git a/HTanks.hs b/HTanks.hs
index fd4b018..c2a5437 100644
--- a/HTanks.hs
+++ b/HTanks.hs
@@ -11,12 +11,12 @@ import GLX
import Control.Concurrent (threadDelay)
import Control.Monad.State
import Data.Maybe
-import System.Time
+import Data.Time.Clock
data MainState = MainState
{ driver :: !SomeDriver
- , time :: !ClockTime
+ , time :: !UTCTime
}
newtype MainT m a = MainT (StateT MainState m a)
@@ -33,8 +33,8 @@ main = do
gl <- initGL glxDriver
when (initialized gl) $ do
- clockTime <- getClockTime
- let mainState = MainState {driver = SomeDriver gl, time = clockTime}
+ currentTime <- getCurrentTime
+ let mainState = MainState {driver = SomeDriver gl, time = currentTime}
gameState = GameState {level = testLevel, tanks = [Tank 0.0 0.0 0]}
setup 800 600
@@ -42,8 +42,8 @@ main = do
deinitGL gl
-minFrameTime :: Integer
-minFrameTime = 10
+minFrameTime :: NominalDiffTime
+minFrameTime = 0.01
mainLoop :: Main ()
mainLoop = do
@@ -55,27 +55,25 @@ mainLoop = do
liftIO $ swapBuffers gl
- newTime <- liftIO getClockTime
- let td = timeDiff newTime t
- when (td < minFrameTime) $
- liftIO $ threadDelay $ fromIntegral $ 1000*(minFrameTime - td)
+ rtime <- liftIO getCurrentTime
+ let drender = diffUTCTime rtime t
+ when (drender < minFrameTime) $
+ liftIO $ threadDelay $ truncate $ 1e6*(minFrameTime - drender)
- newTime <- liftIO getClockTime
- let td = timeDiff newTime t
+ currenttime <- liftIO getCurrentTime
+ let d = round $ 1e3*(diffUTCTime currenttime t)
- lift $ modify $ \state -> state {tanks = (Tank ((posx . head . tanks $ state)+0.0001*(fromIntegral td)) 0.0 0):(tail . tanks $ state)}
+ lift $ modify $ \state -> state {tanks = (Tank ((posx . head . tanks $ state)+(0.0001* fromIntegral d)) 0.0 0):(tail . tanks $ state)}
- --liftIO $ print $ timeDiff newTime t
+ liftIO $ print $ d
- modify $ \state -> state {time = newTime}
+ let newtime = addUTCTime ((1e-3)*(fromIntegral d)) t
+
+ modify $ \state -> state {time = newtime}
when run $ mainLoop
-timeDiff :: ClockTime -> ClockTime -> Integer
-timeDiff (TOD s1 ps1) (TOD s2 ps2) = (s1-s2)*1000 + (ps1-ps2)`div`1000000000
-
-
handleEvents :: Driver a => a -> IO Bool
handleEvents gl = do
event <- nextEvent gl