packages feed

click-clack-1.0.1: src/Loop.hs

module Loop where

import Data.IORef
import Data.StateVar
import qualified Graphics.UI.GLFW as G
import qualified Graphics.Rendering.OpenGL as G
import qualified Physics.Hipmunk as H

import System.Exit

import World 
import Types
import Inits
import Utils

gameLoop :: IO ()
gameLoop = do
    initGame
    loop =<< newIORef =<< initWorld


loop :: IORef World -> IO ()
loop worldRef = do
    world <- get worldRef
    drawWorld world
    (world, dt) <- updateWorld world
    worldRef $= world
    G.sleep (max 0 $ frameTime - dt) 
    loop worldRef
 

initGame :: IO ()
initGame = do 
    H.initChipmunk
    initGLFW

-- initGLFW

initGLFW :: IO ()
initGLFW = do
    G.initialize
    G.openWindow (G.Size (d2gli windowWidth) (d2gli windowHeight)) 
        [] G.Window
    G.windowTitle $= title
    G.windowCloseCallback $= exitWith ExitSuccess
    G.windowSizeCallback  $= (\size -> G.viewport $= (G.Position 0 0, size))
    G.clearColor $= G.Color4 1 1 1 1
    G.blend      $= G.Enabled
    G.blendFunc  $= (G.SrcAlpha, G.OneMinusSrcAlpha)
    G.ortho (-dw2) (dw2) (-dh2) (dh2) (-1) 1
    where dw2 = realToFrac $ windowWidth / 2
          dh2 = realToFrac $ windowHeight / 2