packages feed

astrds-0.1: src/Render.hs

module Render where

import Control.Monad
import qualified Graphics.UI.SDL as SDL hiding (init)
import qualified Graphics.UI.SDL.TTF as SDL
import qualified Graphics.Rendering.OpenGL as GL
import Data.Word
import qualified Data.Map as M
import qualified Data.Traversable as M
import System.IO
import System.Random
import Data.Maybe

import States

import RenderInterface
import RenderUtil

import StaticInterface 

import Pic 
import Utilities
import Config

standardRenderEngine :: Static -> RenderEngine
standardRenderEngine static = RenderEngine (render static)
                                           (renderEnd static)

-- type Render a = Int -> a -> IO ()
-- type RenderStatic a = Static -> Int -> a -> IO ()

render :: RenderStatic State 
render st dt s = do 
                  clearScreen
                  -- painting the virtual screen 
                  renderVirtualScreen dt s st
                  -- update the image on screen
                  showScreen

renderVirtualScreen :: Int -> State -> Static -> IO ()
renderVirtualScreen dt s st
    = do
       -- interpolate the new positions (using dt)
       let s' = if dt /= 0 then interpolateState s dt
                           else s
       -- render the background
       renderBackground st 
       -- render the rocks
       mapM_ (renderRock st) (rocks s)
       -- render the collectibles
       mapM_ (renderCollectible st) (collectibles s)
       -- render the player's ship
       renderPlayer st (player s')
       -- render the score 
       renderScore st (score s')
       return ()

---------------------------------------------------------------------------
-- * Rendering parts of the level state
---------------------------------------------------------------------------
    
-- | Render the background.
renderBackground :: Static -> IO ()
renderBackground st = renderImg (bg_image (images st)) 
                                (fromIntegral maxXview/2, fromIntegral maxYview/2)

-- | Render a rock at the given position.
renderRock :: Static -> Rock -> IO ()
renderRock st f = renderImgAttr (defaultRenderAttr { ra_scale = scale f})
                                (rock_image (images st))
                                (pos f)

-- | Render a collectible at the given position.
renderCollectible :: Static -> Collectible -> IO ()
renderCollectible st f = renderImgAttr (defaultRenderAttr { ra_scale = scale f})
                                       (coll_image (images st))
                                       (pos f)

-- | Render the player's ship.
renderPlayer :: Static -> Player -> IO ()
renderPlayer st f = renderImgAttr (defaultRenderAttr { ra_scale = scale f})
                                  (pl_image (images st))
                                  (pos f)

-- | Render the score.
renderScore :: Static -> Int -> IO ()
renderScore st n = renderText ("score: " ++ show n) textColour (5,5) st

---------------------------------------------------------------------------
-- * Render end of this level
---------------------------------------------------------------------------

renderEnd :: RenderEndStatic
renderEnd st s 
  = do 
      renderEndOverlay st s
      let msg = "game over! collected: " ++ show (score s)
      renderBigText msg textColour (0, fromIntegral maxYview - 80) st
      SDL.glSwapBuffers

renderEndOverlay :: Static -> State -> IO ()
renderEndOverlay st s =
  let overlay_img = overlay . images $ st
  in  renderImg overlay_img (pos (player s))