#18 Optimes rendering by caching PNGs
This commit is contained in:
parent
7e2448c8b9
commit
91770a48fb
2 changed files with 125 additions and 0 deletions
86
lib/CardRenderer.hs
Normal file
86
lib/CardRenderer.hs
Normal file
|
@ -0,0 +1,86 @@
|
|||
module CardRenderer
|
||||
( cardHeight
|
||||
, cardWidth
|
||||
|
||||
, renderCard
|
||||
, renderStack
|
||||
, renderStacks
|
||||
) where
|
||||
|
||||
import CardDeck
|
||||
import PNGRenderer
|
||||
|
||||
----------------------------- Constants ------------------------------
|
||||
|
||||
-- The asset directory
|
||||
assetDir :: [Char]
|
||||
assetDir = "./lib/assets/"
|
||||
|
||||
cardWidth :: Float
|
||||
cardWidth = 100
|
||||
|
||||
cardHeight :: Float
|
||||
cardHeight = 134
|
||||
|
||||
-- Map of all (rendered) cards
|
||||
cardRenders :: [Picture]
|
||||
cardRenders = back:placeHolder:deck
|
||||
where deck = map (renderCard' . showCard) generateDeck
|
||||
back = renderPNG $ assetDir ++ "back.png"
|
||||
placeHolder = renderPNG $ assetDir ++ "placeholder.png"
|
||||
|
||||
amountOfValues :: Int
|
||||
amountOfValues = length $ init $ enumFrom Ace
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
-- Render a card using renderPNG.
|
||||
renderCard' :: Card -> Picture
|
||||
renderCard' (_,_,Hidden) = renderPNG $ assetDir ++ "back.png"
|
||||
renderCard' (ctype,cvalue,_) = renderPNG $ file_dir ++ file_name
|
||||
where typestring = cardTypeToString ctype
|
||||
valuestring = cardTypeToChar cvalue
|
||||
file_dir = assetDir ++ typestring ++ "s/"
|
||||
file_name = typestring ++ "-" ++ valuestring ++ ".png"
|
||||
|
||||
-- Render a card using the cached cards.
|
||||
renderCard :: Card -> Picture
|
||||
renderCard (_, _, Hidden) = head cardRenders
|
||||
renderCard (cType, cValue, _) = cardRenders !! index
|
||||
where index = 2 + t * amountOfValues + v
|
||||
t = fromEnum cType
|
||||
v = fromEnum cValue
|
||||
|
||||
-- Spread cards out, by moving each card a distance x over the x-axis
|
||||
-- and y over the y-axis.
|
||||
spread :: Float -> Float -> [Picture] -> [Picture]
|
||||
spread x y = zipWith shift [0 .. ]
|
||||
where shift index = translate (x * index) (y * index)
|
||||
|
||||
-- Render all cards of a stack with a card inset of given value.
|
||||
renderStack :: Float -> Stack -> Picture
|
||||
renderStack _ [] = cardRenders !! 1
|
||||
renderStack cardDist stack = compose spreadOutStack
|
||||
where renderedStack = map renderCard $ reverse stack
|
||||
spreadOutStack = spread 0 cardDist renderedStack
|
||||
|
||||
-- Render all cards of multiple stacks, with a given distance between
|
||||
-- all stacks and a different distance between cards.
|
||||
renderStacks :: Float -> Float -> [Stack] -> Picture
|
||||
renderStacks stackDist cardDist = compose . spreadOutStacks
|
||||
where renderedStacks = map (renderStack cardDist)
|
||||
spreadOutStacks = spread (stackDist + cardWidth) 0 . renderedStacks
|
||||
|
||||
cardTypeToString :: CardType -> [Char]
|
||||
cardTypeToString Clubs = "club"
|
||||
cardTypeToString Diamonds = "diamond"
|
||||
cardTypeToString Hearts = "heart"
|
||||
cardTypeToString Spades = "spade"
|
||||
cardTypeToString _ = ""
|
||||
|
||||
cardTypeToChar :: CardValue -> [Char]
|
||||
cardTypeToChar Ace = "A"
|
||||
cardTypeToChar Jack = "J"
|
||||
cardTypeToChar Queen = "Q"
|
||||
cardTypeToChar King = "K"
|
||||
cardTypeToChar a = show $ 1 + fromEnum a
|
39
lib/SelectorRenderer.hs
Normal file
39
lib/SelectorRenderer.hs
Normal file
|
@ -0,0 +1,39 @@
|
|||
module SelectorRenderer
|
||||
( renderSelector
|
||||
, renderSelected
|
||||
) where
|
||||
|
||||
import Selector
|
||||
import PNGRenderer
|
||||
|
||||
----------------------------- Constants ------------------------------
|
||||
|
||||
selectorFilePath :: FilePath
|
||||
selectorFilePath = "./lib/assets/selector.png"
|
||||
|
||||
selectedFilePath :: FilePath
|
||||
selectedFilePath = "./lib/assets/selected.png"
|
||||
|
||||
selectorRenders :: (Picture, Picture)
|
||||
selectorRenders = (
|
||||
renderPNG selectorFilePath,
|
||||
renderPNG selectedFilePath
|
||||
)
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
-- Render the outline of the selector. The offset for every value 1
|
||||
-- in the coordinate must be given.
|
||||
renderSelector :: Float -> Float -> Selector -> Picture
|
||||
renderSelector a b Selector{ position = (x,y) } = translate fx fy render
|
||||
where fx = fromIntegral x * a
|
||||
fy = fromIntegral y * b
|
||||
render = fst selectorRenders
|
||||
|
||||
-- Render the selected piece if any.
|
||||
renderSelected :: Float -> Float -> Selector -> Picture
|
||||
renderSelected a b Selector{ selected = Just (x, y) } = translate fx fy render
|
||||
where fx = fromIntegral x * a
|
||||
fy = fromIntegral y * b
|
||||
render = snd selectorRenders
|
||||
renderSelected _ _ _ = blank
|
Reference in a new issue