Untitled
module Desenhar where import Graphics.Gloss import ImmutableTowers import LI12425 -- Função principal para desenhar o mapa desenha :: ImmutableTowers -> Picture desenha (ImmutableTowers Jogo {baseJogo = base, portaisJogo = lportais, torresJogo = ltorres, inimigosJogo = linimigos, mapaJogo = mapa}) = Pictures $ concatMap desenhaLinha (zip [0..] mapa) ++ [desenhaBase posbase] ++ (map desenhaTorres ldesenhatorres) ++ (map desenhaPortais lposportais) ++ (map desenhaInimigo ldesenhainimigos) where (lposinimigos, ldirecaoinimigos) = ((map (\i -> posicaoInimigo i) linimigos),(map (\i -> direcaoInimigo i) linimigos)) ldesenhainimigos = zip lposinimigos ldirecaoinimigos lposportais = map (\i -> posicaoPortal i) lportais (lpostorres, ltipoprojtorres) = (map (\i -> posicaoTorre i) ltorres, map (\i -> tipoProjetil i) (map (\i -> projetilTorre i) ltorres)) ldesenhatorres = zip lpostorres ltipoprojtorres posbase = posicaoBase base desenhaLinha :: (Int, [Terreno]) -> [Picture] desenhaLinha (y, linha) = concatMap (desenhaChao y) (zip [0..] linha) desenhaChao :: Int -> (Int, Terreno) -> [Picture] desenhaChao y (x, terreno) = [desenhaTerreno terreno (posicaoCentro x y)] -- Calcula a posição do centro de um quadrado no mapa posicaoCentro :: Int -> Int -> (Float, Float) posicaoCentro x y = (fromIntegral x + 0.5, fromIntegral y + 0.5) -- Função para desenhar cada tipo de terreno desenhaTerreno :: Terreno -> Posicao -> Picture desenhaTerreno Agua (x, y) = desenhaChaoBase (x, y) (makeColorI 154 209 221 255) desenhaTerreno Relva (x, y) = desenhaChaoBase (x, y) (makeColorI 91 142 80 255) desenhaTerreno Terra (x, y) = desenhaChaoBase (x, y) (makeColorI 186 140 93 255) desenhaChaoBase :: Posicao -> Color -> Picture desenhaChaoBase (x, y) color = Color color $ translate (x * w) (y * h) $ rectangleSolid w h w :: Float w = 40 h :: Float h = 40 -- tentar perceber porque o mapa esta ao contrario!! desenhaInimigo :: (Posicao, Direcao) -> Picture desenhaInimigo ((x, y),d) |d == Este = translate (x * 40) (y * 40) desenhaInimigoEste |d == Oeste = translate (x * 40) (y * 40) desenhaInimigoOeste |d == Sul = translate (x * 40) (y * 40) desenhaInimigoSul |d == Norte = translate (x * 40) (y * 40) desenhaInimigoNorte desenhaInimigoEste :: Picture desenhaInimigoEste = Pictures [cara, olhos, capacete, corpo, pernas, bracos, espada] where capacete = Pictures [Color red $ polygon [(-6,14), (6,14), (6,20), (-6,20)], Color (greyN 0.6) $ polygon [(-10, 14), (10, 14), (10,8), (8,8), (8,11), (6,11), (6,8), (4,8), (4,11), (2,11), (2,8), (-2,8), (-2,11), (-4,11), (-4,8), (-6,8), (-6,11), (-8,11), (-8,8) ,(-10,8)], Color (greyN 0) $ polygon [(8,8), (6,8), (6,11), (8,11)], Color (greyN 0) $ polygon [(4,8), (2,8), (2,11), (4,11)], Color (greyN 0) $ polygon [(-4,8), (-2,8), (-2,11), (-4,11)], Color (greyN 0) $ polygon [(-8,8), (-6,8), (-6,11), (-8,11)]] cara = Color (makeColorI 254 223 158 255) $ polygon [(-10, 0), (10, 0), (10, 8), (-10, 8)] olhos = Pictures [ translate (-4) 4 $ Color (greyN 0) $ rectangleSolid 4 4 , translate (8) 4 $ Color (greyN 0) $ rectangleSolid 4 4] corpo = Pictures [Color (greyN 0.6) $ polygon [(-10,0), (10,0), (10, -11), (-10,-11)], Color (greyN 0.4) $ polygon [(-1,0), (1,0), (1,-11), (-1,-11)], Color (greyN 0.4) $ polygon [(-9,-4), (9,-4), (9,-5), (-9,-5)], Color (greyN 0.4) $ polygon [(-5,-7), (5,-7), (5,-8), (-5,-8)], Color (greyN 0.4) $ polygon [(-5,-9), (5,-9), (5,-10), (-5,-10)]] pernas = Pictures [Color red $ polygon [(-10,-11), (10,-11),(11,-13), (-11,-13)], Color (makeColorI 254 223 158 255) $ polygon [(-8,-13), (-4,-13), (-4,-16), (-8,-16)], Color (makeColorI 254 223 158 255) $ polygon [(8,-13), (4,-13), (4,-16), (8,-16)], Color (makeColorI 79 42 13 255) $ polygon [(8,-16), (4,-16), (4,-18), (8,-18)], Color (makeColorI 79 42 13 255) $ polygon [(-8,-16), (-4,-16), (-4,-18), (-8,-18)]] bracos = Pictures [Color (makeColorI 254 223 158 255) $ polygon [(10,0), (10,-4), (13,-10), (15,-6)], Color (makeColorI 254 223 158 255) $ polygon [(-10,0), (-10,-4), (-13,-10), (-15,-6)]] espada = translate (-14) (-7) $ rotate (-15) $ Pictures [Color (makeColorI 79 42 13 255) $ polygon [(-1,0), (1,0), (1,4), (-1,4)], Color (greyN 0.3) $ polygon [(-3,4), (3,4), (3,6), (-3,6)], Color (greyN 0.7) $ polygon [(0,6), (-2,6), (-3, 12), (0,16)], Color (greyN 0.8) $ polygon [(0,6), (2,6), (3, 12), (0,16)]] desenhaInimigoOeste :: Picture desenhaInimigoOeste = Pictures [cara, olhos, capacete, corpo, pernas, bracos, espada] where capacete = Pictures [Color red $ polygon [(-6,14), (6,14), (6,20), (-6,20)], Color (greyN 0.6) $ polygon [(-10, 14), (10, 14), (10,8), (8,8), (8,11), (6,11), (6,8), (4,8), (4,11), (2,11), (2,8), (-2,8), (-2,11), (-4,11), (-4,8), (-6,8), (-6,11), (-8,11), (-8,8) ,(-10,8)], Color (greyN 0) $ polygon [(8,8), (6,8), (6,11), (8,11)], Color (greyN 0) $ polygon [(4,8), (2,8), (2,11), (4,11)], Color (greyN 0) $ polygon [(-4,8), (-2,8), (-2,11), (-4,11)], Color (greyN 0) $ polygon [(-8,8), (-6,8), (-6,11), (-8,11)]] cara = Color (makeColorI 254 223 158 255) $ polygon [(-10, 0), (10, 0), (10, 8), (-10, 8)] olhos = Pictures [ translate (4) 4 $ Color (greyN 0) $ rectangleSolid 4 4 , translate (-8) 4 $ Color (greyN 0) $ rectangleSolid 4 4] corpo = Pictures [Color (greyN 0.6) $ polygon [(-10,0), (10,0), (10, -11), (-10,-11)], Color (greyN 0.4) $ polygon [(-1,0), (1,0), (1,-11), (-1,-11)], Color (greyN 0.4) $ polygon [(-9,-4), (9,-4), (9,-5), (-9,-5)], Color (greyN 0.4) $ polygon [(-5,-7), (5,-7), (5,-8), (-5,-8)], Color (greyN 0.4) $ polygon [(-5,-9), (5,-9), (5,-10), (-5,-10)]] pernas = Pictures [Color red $ polygon [(-10,-11), (10,-11),(11,-13), (-11,-13)], Color (makeColorI 254 223 158 255) $ polygon [(-8,-13), (-4,-13), (-4,-16), (-8,-16)], Color (makeColorI 254 223 158 255) $ polygon [(8,-13), (4,-13), (4,-16), (8,-16)], Color (makeColorI 79 42 13 255) $ polygon [(8,-16), (4,-16), (4,-18), (8,-18)], Color (makeColorI 79 42 13 255) $ polygon [(-8,-16), (-4,-16), (-4,-18), (-8,-18)]] bracos = Pictures [Color (makeColorI 254 223 158 255) $ polygon [(10,0), (10,-4), (13,-10), (15,-6)], Color (makeColorI 254 223 158 255) $ polygon [(-10,0), (-10,-4), (-13,-10), (-15,-6)]] espada = translate (14) (-7) $ rotate 15 $ Pictures [Color (makeColorI 79 42 13 255) $ polygon [(-1,0), (1,0), (1,4), (-1,4)], Color (greyN 0.3) $ polygon [(-3,4), (3,4), (3,6), (-3,6)], Color (greyN 0.5) $ polygon [(0,6), (-2,6), (-3, 12), (0,16)], Color (greyN 0.6) $ polygon [(0,6), (2,6), (3, 12), (0,16)]] desenhaInimigoSul :: Picture desenhaInimigoSul = Pictures [cara, olhos, capacete, corpo, pernas, bracos, espada] where capacete = Pictures [Color red $ polygon [(-2,14), (2,14), (2,20), (-2,20)], Color (greyN 0.6) $ polygon [(-10, 14), (10, 14), (10,8), (8,8), (8,11), (6,11), (6,8), (4,8), (4,11), (2,11), (2,8), (-2,8), (-2,11), (-4,11), (-4,8), (-6,8), (-6,11), (-8,11), (-8,8) ,(-10,8)], Color (greyN 0) $ polygon [(8,8), (6,8), (6,11), (8,11)], Color (greyN 0) $ polygon [(4,8), (2,8), (2,11), (4,11)], Color (greyN 0) $ polygon [(-4,8), (-2,8), (-2,11), (-4,11)], Color (greyN 0) $ polygon [(-8,8), (-6,8), (-6,11), (-8,11)]] cara = Color (makeColorI 254 223 158 255) $ polygon [(-10, 0), (10, 0), (10, 8), (-10, 8)] olhos = Pictures [ translate (6) 4 $ Color (greyN 0) $ rectangleSolid 4 4 , translate (-6) 4 $ Color (greyN 0) $ rectangleSolid 4 4] corpo = Pictures [Color (greyN 0.6) $ polygon [(-10,0), (10,0), (10, -11), (-10,-11)], Color (greyN 0.4) $ polygon [(-1,0), (1,0), (1,-11), (-1,-11)], Color (greyN 0.4) $ polygon [(-9,-4), (9,-4), (9,-5), (-9,-5)], Color (greyN 0.4) $ polygon [(-5,-7), (5,-7), (5,-8), (-5,-8)], Color (greyN 0.4) $ polygon [(-5,-9), (5,-9), (5,-10), (-5,-10)]] pernas = Pictures [Color red $ polygon [(-10,-11), (10,-11),(11,-13), (-11,-13)], Color (makeColorI 254 223 158 255) $ polygon [(-8,-13), (-4,-13), (-4,-16), (-8,-16)], Color (makeColorI 254 223 158 255) $ polygon [(8,-13), (4,-13), (4,-16), (8,-16)], Color (makeColorI 79 42 13 255) $ polygon [(8,-16), (4,-16), (4,-18), (8,-18)], Color (makeColorI 79 42 13 255) $ polygon [(-8,-16), (-4,-16), (-4,-18), (-8,-18)]] bracos = Pictures [Color (makeColorI 254 223 158 255) $ polygon [(10,0), (10,-4), (13,-10), (15,-6)], Color (makeColorI 254 223 158 255) $ polygon [(-10,0), (-10,-4), (-13,-10), (-15,-6)]] espada = translate (-14) (-7) $ rotate (-15) $ Pictures [Color (makeColorI 79 42 13 255) $ polygon [(-1,0), (1,0), (1,4), (-1,4)], Color (greyN 0.3) $ polygon [(-3,4), (3,4), (3,6), (-3,6)], Color (greyN 0.5) $ polygon [(0,6), (-2,6), (-3, 12), (0,16)], Color (greyN 0.6) $ polygon [(0,6), (2,6), (3, 12), (0,16)]] desenhaInimigoNorte :: Picture desenhaInimigoNorte = Pictures [capacete, corpo, pernas, bracos, espada] where capacete = Pictures [Color red $ polygon [(-2,14), (2,14), (2,20), (-2,20)], Color (greyN 0.6) $ polygon [(-10,14), (10,14), (10,4), (-10,4)], Color (makeColorI 254 223 158 255) $ polygon [(-10,4), (10,4), (10,0), (-10,0)]] corpo = Pictures [Color (greyN 0.6) $ polygon [(-10,0), (10,0), (10, -11), (-10,-11)]] pernas = Pictures [Color red $ polygon [(-10,-11), (10,-11),(11,-13), (-11,-13)], Color (makeColorI 254 223 158 255) $ polygon [(-8,-13), (-4,-13), (-4,-16), (-8,-16)], Color (makeColorI 254 223 158 255) $ polygon [(8,-13), (4,-13), (4,-16), (8,-16)], Color (makeColorI 79 42 13 255) $ polygon [(8,-16), (4,-16), (4,-18), (8,-18)], Color (makeColorI 79 42 13 255) $ polygon [(-8,-16), (-4,-16), (-4,-18), (-8,-18)]] bracos = Pictures [Color (makeColorI 254 223 158 255) $ polygon [(10,0), (10,-4), (13,-10), (15,-6)], Color (makeColorI 254 223 158 255) $ polygon [(-10,0), (-10,-4), (-13,-10), (-15,-6)]] espada = translate (14) (-7) $ rotate (15) $ Pictures [Color (makeColorI 79 42 13 255) $ polygon [(-1,0), (1,0), (1,4), (-1,4)], Color (greyN 0.3) $ polygon [(-3,4), (3,4), (3,6), (-3,6)], Color (greyN 0.5) $ polygon [(0,6), (-2,6), (-3, 12), (0,16)], Color (greyN 0.6) $ polygon [(0,6), (2,6), (3, 12), (0,16)]] desenhaPortais :: Posicao -> Picture desenhaPortais (x,y) = Color yellow $ translate (x * 40) (y * 40) $ circleSolid 15 desenhaTorres :: (Posicao, TipoProjetil) -> Picture desenhaTorres ((x,y), tipoproj) |tipoproj == Fogo = desenhaTorreFogo (x,y) |tipoproj == Gelo = desenhaTorreGelo (x,y) |tipoproj == Resina = desenhaTorreResina (x,y) desenhaTorreFogo :: Posicao -> Picture desenhaTorreFogo (x, y) = Pictures [ Color (greyN 0.5) $ translate (x * 40) (y * 40) desenhaBaseTorre , Color red $ translate (x * 40) (y * 40 + 15) desenhaTopoTorre ] desenhaTorreGelo :: Posicao -> Picture desenhaTorreGelo (x, y) = Pictures [ Color (greyN 0.5) $ translate (x * 40) (y * 40) desenhaBaseTorre , Color blue $ translate (x * 40) (y * 40 + 15) desenhaTopoTorre ] desenhaTorreResina :: Posicao -> Picture desenhaTorreResina (x, y) = Pictures [ Color (greyN 0.5) $ translate (x * 40) (y * 40) desenhaBaseTorre , Color green $ translate (x * 40) (y * 40 + 15) desenhaTopoTorre ] desenhaBaseTorre :: Picture desenhaBaseTorre = rectangleSolid 20 30 desenhaTopoTorre :: Picture desenhaTopoTorre = polygon [(-10,0), (10,0), (0,10)] desenhaBase :: Posicao -> Picture desenhaBase (x,y) = Color (greyN 0.5) $ translate (x * 40) (y * 40) $ rectangleSolid 30 30 mapa01 :: [[Terreno]] mapa01 = [ [t,t,a,r,r,r,r,r], [a,t,a,a,r,t,t,t], [a,t,a,a,r,t,r,a], [a,t,a,a,r,t,r,a], [t,t,a,a,r,t,t,t], [t,a,a,a,r,r,r,t], [t,a,t,t,t,t,t,t], [t,t,t,a,r,r,r,a] ] where t = Terra r = Relva a = Agua
Leave a Comment