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))