Untitled
unknown
plain_text
a year ago
4.5 kB
4
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