Untitled

 avatar
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