Untitled

 avatar
unknown
plain_text
a month ago
12 kB
3
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 = Agua
Leave a Comment