Restructuring, #9
This commit is contained in:
parent
2055ef234e
commit
dab6fadad4
41 changed files with 941 additions and 680 deletions
91
lib/RPGEngine/Render/Playing.hs
Normal file
91
lib/RPGEngine/Render/Playing.hs
Normal file
|
@ -0,0 +1,91 @@
|
|||
module RPGEngine.Render.Playing
|
||||
( renderPlaying
|
||||
) where
|
||||
|
||||
import RPGEngine.Render.Core ( Renderer, getRender, setRenderPos )
|
||||
|
||||
import RPGEngine.Data
|
||||
( Player(..),
|
||||
Entity(..),
|
||||
Item(..),
|
||||
Physical(..),
|
||||
Layout,
|
||||
Level(..),
|
||||
State(..),
|
||||
Game(..) )
|
||||
import Graphics.Gloss ( Picture, pictures )
|
||||
import Graphics.Gloss.Data.Picture (translate)
|
||||
import RPGEngine.Config (resolution, zoom)
|
||||
|
||||
------------------------------ Exported ------------------------------
|
||||
|
||||
renderPlaying :: Renderer Game
|
||||
renderPlaying g@Game{ state = Playing { level = lvl }, player = player } = pictures [
|
||||
renderLevel lvl,
|
||||
renderPlayer player
|
||||
]
|
||||
|
||||
------------------------------- Player -------------------------------
|
||||
|
||||
renderPlayer :: Renderer Player
|
||||
renderPlayer Player{ position = (x, y) } = move picture
|
||||
where move = setRenderPos x y
|
||||
picture = getRender "player"
|
||||
|
||||
-- Center the player in the middle of the screen.
|
||||
-- Not in use at the moment, might be useful later.
|
||||
focusPlayer :: Game -> Picture -> Picture
|
||||
focusPlayer Game{ player = Player{ position = (x, y)}} = move
|
||||
where move = translate centerX centerY
|
||||
centerX = resolution * zoom * fromIntegral (negate x)
|
||||
centerY = resolution * zoom * fromIntegral (negate y)
|
||||
|
||||
------------------------------- Level --------------------------------
|
||||
|
||||
renderLevel :: Renderer Level
|
||||
renderLevel Level{ layout = l, items = i, entities = e } = level
|
||||
where level = pictures [void, layout, items, entities]
|
||||
void = createVoid
|
||||
layout = renderLayout l
|
||||
items = renderItems i
|
||||
entities = renderEntities e
|
||||
|
||||
renderLayout :: Layout -> Picture
|
||||
renderLayout strips = pictures [setRenderPos 0 y (renderStrip (strips !! y)) | y <- [0 .. count]]
|
||||
where count = length strips - 1
|
||||
|
||||
renderStrip :: [Physical] -> Picture
|
||||
renderStrip list = pictures physicals
|
||||
where physicals = [setRenderPos x 0 (image (list !! x)) | x <- [0 .. count]]
|
||||
image Void = getRender "void"
|
||||
image Walkable = getRender "tile"
|
||||
image Blocked = getRender "wall"
|
||||
image Entrance = pictures [getRender "tile", getRender "entrance"]
|
||||
image Exit = pictures [getRender "tile", getRender "exit"]
|
||||
count = length list - 1
|
||||
|
||||
createVoid :: Picture
|
||||
createVoid = setRenderPos offX offY $ pictures voids
|
||||
where voids = [setRenderPos x y void | x <- [0 .. width], y <- [0 .. height]]
|
||||
void = getRender "void"
|
||||
intZoom = round zoom :: Int
|
||||
height = round $ 4320 / resolution / zoom
|
||||
width = round $ 7680 / resolution / zoom
|
||||
offX = negate (width `div` 2)
|
||||
offY = negate (height `div` 2)
|
||||
|
||||
-------------------------- Items & Entities --------------------------
|
||||
|
||||
renderItems :: [Item] -> Picture
|
||||
renderItems list = pictures $ map renderItem list
|
||||
|
||||
renderItem :: Item -> Picture
|
||||
renderItem Item{ itemId = id, itemX = x, itemY = y} = setRenderPos x y image
|
||||
where image = getRender id
|
||||
|
||||
renderEntities :: [Entity] -> Picture
|
||||
renderEntities list = pictures $ map renderEntity list
|
||||
|
||||
renderEntity :: Entity -> Picture
|
||||
renderEntity Entity{ entityId = id, entityX = x, entityY = y} = setRenderPos x y image
|
||||
where image = getRender id
|
Reference in a new issue