Untitled

 avatar
unknown
plain_text
a year ago
6.3 kB
2
Indexable
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game
import Graphics.Gloss.Interface.Pure.Game
import Graphics.Gloss.Data.Bitmap
import Data.Maybe
import LI12324
import Tarefa4



type MapaBlocos = [[Bloco]]


data Menu = Opcoes | EmJogo | MenuInicial
data Opcoes = Jogar | Sair

data CategoriaImagens = IBlocos | IPersonagem | IInimigos

type ImagensBlocos = [(Bloco, Picture)]
type ImagensPersonagens = [(Entidade, Picture)]

data Imagens = Imagens {blocos :: ImagensBlocos,
                        personagens :: ImagensPersonagens
                       }

data World = World { jogo :: Jogo
                   , menu :: Menu
                   , opcao :: Opcoes
                   , imagens :: Imagens
                   }



m1 :: Mapa
m1 = Mapa ((0.5,5.5), Oeste) (3.5,3.5) mapaBl

mapaBl :: MapaBlocos
mapaBl = [[P, P, P, P, P, P, P, P, P, P],
          [P, V, V, V, V, V, V, V, V, P],
          [P, V, V, P, P, P, P, V, V, P],
          [P, V, V, E, V, V, E, V, V, P],
          [P, V, V, E, V, V, E, V, V, P],
          [P, V, P, P, P, P, P, P, V, P],
          [P, V, E, V, V, V, V, E, V, P],
          [P, V, E, V, V, V, V, E, V, P],
          [P, P, P, P, A, A, P, P, P, P],
          [P, E, V, V, V, V, V, V, E, P],
          [P, E, V, V, V, V, V, V, E, P],
          [P, P, P, P, P, P, P, P, P, P]]


inim = [Personagem {velocidade = (1,1), posicao = (2.5,2.5), tipo = MacacoMalvado, vida = 1, tamanho = (1,1), direcao = Este, emEscada = False, ressalta = False, pontos = 2, aplicaDano = (False,0)}
       ,Personagem {velocidade = (1,1), posicao = (7.5,2.5), tipo = Fantasma,      vida = 1, tamanho = (1,1), direcao = Este, emEscada = False, ressalta = False, pontos = 2, aplicaDano = (False,0)}
       ,Personagem {velocidade = (1,1), posicao = (4.5,4.5), tipo = MacacoMalvado, vida = 2, tamanho = (1,1), direcao = Este, emEscada = False, ressalta = False, pontos = 2, aplicaDano = (False,0)}]
jogad = Personagem  {velocidade = (2,2), posicao = (3.5,10.5), tipo = Jogador,       vida = 2, tamanho = (1,1), direcao = Oeste, emEscada = True, ressalta = False, pontos = 2, aplicaDano = (False,0)}

colec = [(Moeda,(0.5,0.5)), (Martelo,(2.5,2.5)), (Moeda,(4.5,6))]

jogoInicial :: Jogo
jogoInicial = Jogo m1 inim colec jogad




--personagens :: (Entidade,[Picture]) -> Picture
--personagens (Jogador,pics) = pics !! 0



blocosPic :: (Bloco,Picture) -> Picture
blocosPic (P,p) = p
blocosPic (E,e) = e
blocosPic (A,a) = a
blocosPic (V,_) = Blank


desenhaLinha :: [(Bloco,Picture)] -> Int -> [Picture]
desenhaLinha [] _ = []
desenhaLinha (bp:t) x = translate (fromIntegral (x*64)) 350 (blocosPic bp):desenhaLinha t (x+1)


desenhaMapa :: [[(Bloco,Picture)]] -> (Int,Int) -> [Picture]
desenhaMapa [] _ = []
desenhaMapa (bp:t) (x,y) = translate (-250) (fromIntegral (y*(-64))) (pictures (desenhaLinha bp x)):desenhaMapa t (x,y+1)


blocoPic :: Bloco -> ImagensBlocos -> (Bloco,Picture)
blocoPic P p = (P,snd (p !! 0))
blocoPic E e = (E,snd (e !! 1))
blocoPic A a = (A,snd (a !! 2))
blocoPic V v = (V, Blank)

blocoComIm  :: [[Bloco]] -> ImagensBlocos -> [[(Bloco,Picture)]]
blocoComIm [[]] _ = []
blocoComIm mpbl imbl = map (map (\x -> blocoPic  x imbl)) mpbl


blToIm :: Imagens -> ImagensBlocos
blToIm (Imagens {blocos = imbl}) = imbl

jogIm :: Imagens -> [(Entidade,Picture)]
jogIm (Imagens {personagens = [(Jogador,j)]}) = [(Jogador,j)]


desenhaEstado :: World -> Picture
desenhaEstado (World (Jogo m1 inim colec jogad) EmJogo op img) = Pictures $ desenhaMapa (blocoComIm mapaBl imbl) (0,0) ++ [jogPic]
      where imbl = blToIm img
            jogPic = desenhaJogador ((jogIm img) !! 0) (posicao jogad)



desenhaJogador :: (Entidade,Picture) -> (Double, Double)-> Picture
desenhaJogador (Jogador,pic) (x,y) = translate (realToFrac (x*64) - 280) (realToFrac (y*(-64) + 380)) (pictures [pic])


--desenhaJogador :: Personagem -> Int -> MapaBlocos -> [Picture] -> Picture
--desenhaJogador (Personagem  v t (1,1) dir tam esc ress vida pts apDano) n mapa jogPic
--      = translate (fromIntegral (n*500)) 0 (persPic (p,pics))




reageEvento :: Event -> World -> World
reageEvento (EventKey (Char 'w') Down _ _)            (World jogo EmJogo op img) = World (atualiza [Nothing] (Just Subir)         jogo) EmJogo op img
reageEvento (EventKey (Char 'w') Up _ _)              (World jogo EmJogo op img) = World (atualiza [Nothing]  Nothing             jogo) EmJogo op img
reageEvento (EventKey (Char 's') Down _ _)            (World jogo EmJogo op img) = World (atualiza [Nothing] (Just Descer)        jogo) EmJogo op img
reageEvento (EventKey (Char 's') Up _ _)              (World jogo EmJogo op img) = World (atualiza [Nothing]  Nothing             jogo) EmJogo op img
reageEvento (EventKey (Char 'a') Down _ _)            (World jogo EmJogo op img) = World (atualiza [Nothing] (Just AndarEsquerda) jogo) EmJogo op img
reageEvento (EventKey (Char 'a') Up _ _)              (World jogo EmJogo op img) = World (atualiza [Nothing]  Nothing             jogo) EmJogo op img
reageEvento (EventKey (Char 'd') Down _ _)            (World jogo EmJogo op img) = World (atualiza [Nothing] (Just AndarDireita)  jogo) EmJogo op img
reageEvento (EventKey (Char 'd') Up _ _)              (World jogo EmJogo op img) = World (atualiza [Nothing]  Nothing             jogo) EmJogo op img
reageEvento (EventKey (SpecialKey KeySpace) Down _ _) (World jogo EmJogo op img) = World (atualiza [Nothing] (Just Saltar)        jogo) EmJogo op img
reageEvento (EventKey (SpecialKey KeySpace) Up _ _)   (World jogo EmJogo op img) = World (atualiza [Nothing]  Nothing             jogo) EmJogo op img
reageEvento _ s = s




estadoInicial :: Imagens -> World
estadoInicial img = World jogoInicial EmJogo Jogar img



reageTempo :: Float -> World -> World
--reageTempo t (World jogo) = World (movimenta 10 t jogo)
reageTempo _ e = e



displayMode :: Display
displayMode = FullScreen

loadImg :: IO Imagens
loadImg = do p   <- loadBMP "plat.bmp"
             e <- loadBMP "escada.bmp"
             a    <- loadBMP "alc.bmp"
             j  <- loadBMP "mush.bmp"
             return $ Imagens {personagens = [(Jogador,j)], blocos = [(P,p), (E,e), (A, a), (V, Blank)]}


main :: IO ()
main = do
    imgg <- loadImg
    play
        displayMode
        white
        50
        (estadoInicial imgg)
        desenhaEstado
        reageEvento
        reageTempo
Editor is loading...
Leave a Comment