Untitled
unknown
plain_text
5 months ago
4.5 kB
3
Indexable
module Main where import Test.HUnit import Graphics.Gloss import Graphics.Gloss.Interface.Pure.Game -- | Coordenadas são tuplas de Float type Coordenadas = (Float,Float) -- | Estado é representado por uma tupla em que a primeira componente é a lista de coordenadas dos centros dos círculos e a segunda a coordenada do centro do retângulo type Estado = ([Coordenadas],Coordenadas) -- | Função que define o estadoInicial do jogo (coordenadas dos centros dos circulos e do retângulo) estadoInicial :: Estado estadoInicial = ([(-200,-100), (50,-50), (190,100)],(0,0)) {-| Função que dado um Estado retorna uma Picture (gera a imagem do Jogo) -} desenhaEstado :: Estado -> Picture desenhaEstado (lp,cq) = Pictures ((map desenhaCirculo lp) ++ [desenhaQuadrado (cq)]) where desenhaCirculo (cx,cy) = color red $ translate cx cy $ circleSolid 15 desenhaQuadrado (cxq,cyq) = color green $ translate cxq cyq $ rectangleSolid 15 15 {-| Função que reage a um evento comandado pelo utilizador, por ex: ativação de uma tecla e retorna o Estado após a alteração provocada pela tecla == __Exemplos:__ >>> reageEvento (EventKey (SpecialKey KeyUp) Down _ _) ([(-200,-100), (50,-50), (190,100)], (0,0)) ([(-200,-100), (50,-50), (190,100)], (0,15)) >>> reageEvento (EventKey (SpecialKey KeyLeft) Down _ _) ([(-200,-100), (50,-50), (190,100)], (0,0)) ([(-200,-100), (50,-50), (190,100)], (-15,0)) -} reageEvento :: Event -> Estado -> Estado reageEvento (EventKey (SpecialKey KeyUp) Down _ _) (lc,(x,y)) = if y+15+15 >= 300 then (lc,(x,-285)) else (lc,(x,y+15)) reageEvento (EventKey (SpecialKey KeyDown) Down _ _) (lc,(x,y)) = if y-15-15 <= -300 then (lc,(x,285)) else (lc,(x,y-15)) reageEvento (EventKey (SpecialKey KeyLeft) Down _ _) (lc,(x,y)) = if x-15-15 <= -300 then (lc,(285,y)) else (lc,(x-15,y)) reageEvento (EventKey (SpecialKey KeyRight) Down _ _) (lc,(x,y)) = if x+15+15 >= 300 then (lc,(-285,y)) else (lc,(x+15,y)) reageEvento _ e = e -- ignora qualquer outro evento {-| Função que reage ao passar do tempo. Recebe um Float e um Estado e retorna o Estado após determinado tempo ter passado == __Exemplo:__ >>> reageTempo _ [(-200,-100), (50,-50), (190,100)], (0,0)) ([(-200.5,-100.0), (49.5,-50.0), (189.5,100.0)], (0.0,0.0)) -} reageTempo :: Float -> Estado -> Estado reageTempo _ (lc,cq) = (map (\(x,y) -> (max (x-0.5) (-285),y)) lc,cq) -- | Inteiro que representa os frame rates por segundo (FPS) do jogo fr :: Int fr = 50 -- | Função que gera a janela onde irá decorrer o jogo dm :: Display dm = InWindow "Jogo Exemplo" -- título da janela (600,600) -- dimensão da janela (200,200) -- posição no ecran -- | Cor de fundo do jogo corFundo = (greyN 0.5) -- Função main que faz o jogo funcionar main :: IO () main = do play dm -- janela onde irá decorrer o jogo corFundo -- cor do fundo da janela fr -- frame rate estadoInicial -- define estado inicial do jogo desenhaEstado -- desenha o estado do jogo reageEvento -- reage a um evento reageTempo -- reage ao passar do tempo {- verificaPos :: Event -> Estado -> Bool verificaPos (EventKey (SpecialKey KeyUp) Down _ _) (lc,(x,y)) = lc' == lc where (lc',cq) = reageEvento (EventKey (SpecialKey KeyUp) Down _ _) (lc,(x,y)) verificaPos (EventKey (SpecialKey KeyDown) Down _ _) (lc,(x,y)) = lc' == lc where (lc',cq) = reageEvento (EventKey (SpecialKey KeyDown) Down _ _) (lc,(x,y)) verificaPos (EventKey (SpecialKey KeyLeft) Down _ _) (lc,(x,y)) = lc' == lc where (lc',cq) = reageEvento (EventKey (SpecialKey KeyLeft) Down _ _) (lc,(x,y)) verificaPos (EventKey (SpecialKey KeyRight) Down _ _) (lc,(x,y)) = lc' == lc where (lc',cq) = reageEvento (EventKey (SpecialKey KeyRight) Down _ _) (lc,(x,y)) testes = test [teste1,teste2,teste3,teste4] teste1 = "verificaPos - Cima" ~: True ~=? verificaPos (EventKey (SpecialKey KeyUp) Down _ _) ([(-200,-100), (50,-50), (190,100)],(0,0)) teste2 = "verificaPos - Baixo" ~: True ~=? verificaPos (EventKey (SpecialKey KeyDown) Down _ _) ([(-200,-100), (50,-50), (190,100)],(0,0)) teste3 = "verificaPos - Esquerda" ~: True ~=? verificaPos (EventKey (SpecialKey KeyLeft) Down _ _) ([(-200,-100), (50,-50), (190,100)],(0,0)) teste4 = "verificaPos - Direita" ~: True ~=? verificaPos (EventKey (SpecialKey KeyRight) Down _ _) ([(-200,-100), (50,-50), (190,100)],(0,0)) -}
Editor is loading...
Leave a Comment