Untitled
unknown
plain_text
a year ago
12 kB
7
Indexable
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 = AguaEditor is loading...
Leave a Comment