-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.hs
More file actions
305 lines (267 loc) · 10.1 KB
/
Copy pathMain.hs
File metadata and controls
305 lines (267 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
module Main where
import Graphics.Gloss.Juicy (loadJuicy)
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game
import Data.Maybe (fromMaybe)
import LI12324
import Tarefa1
import Tarefa2
import Tarefa3
import Tarefa4
import MapaExemplo
import DadosAuxiliar
import GestorTeclas
import Ajudas
import DadosAuxiliar (Estado, EstadoProjeto, ImagensBloco (imagemEstrela, ImagensBloco))
{-|
função que renderiza o estado inicial do Jogo
-}
renderizaestadoInicial :: IO EstadoProjeto
renderizaestadoInicial = do
imagemJogar' <- loadJuicy "Imagens/IconeJogar.bmp"
imagemSair' <- loadJuicy "Imagens/IconeSair.bmp"
blocos <- renderizaBlocos
imagensPersonagem <- renderizaPersonagens
let mapa = mapa1
let imagemDefault = blank
let imagemJogar = fromMaybe imagemDefault imagemJogar'
let imagemSair = fromMaybe imagemDefault imagemSair'
return $ EstadoProjeto {
tempoTotal = 0,
estadoAtual = Estadodomenu,
menu = Menu { itens = [Jogar, Sair] :: [Menuescolher], opcaoEscolhida = Jogar, imagensMenu = ImagensMenu imagemJogar imagemSair},
jogo = Jogo {
mapa = mapa1,
inimigos = criaInimigosIniciais,
jogador = criaJogadorInicial mapa1,
colecionaveis = colecionaveisInicial
},
blocos = blocos,
imagensPersonagem = imagensPersonagem,
larguraJanela = length (head blocos1) * tamanhoBloco,
alturaJanela = length blocos1 * tamanhoBloco
}
{-|
Função main que renderiza o estado inicial
-}
main :: IO ()
main = do
estadoInicial <- renderizaestadoInicial
let
largura = fromIntegral (larguraJanela estadoInicial)
altura = fromIntegral (alturaJanela estadoInicial)
play
(InWindow "My Donkey Kong" (900,900) (100,100) )
corfundo
60
estadoInicial
renderizarProjeto
handleTeclas
atualizarJogo
{-|
Cor de fundo para depois utilizar na função main
-}
corfundo :: Color
corfundo = makeColor 0 0 0 0
{-|
Função que tendo em conta o estado do Projeto determina se o menu ou o jogo são renderizados
-}
renderizarProjeto :: EstadoProjeto -> Picture
renderizarProjeto estado@(EstadoProjeto { estadoAtual = EstadoJogo}) = renderizarJogo estado
renderizarProjeto estado@(EstadoProjeto{ estadoAtual = Estadodomenu}) = criaMenu estado
{-|
Função que renderiza o menu
-}
criaMenu :: EstadoProjeto -> Picture
criaMenu estado =
case estadoAtual estado of
Estadodomenu -> opcoesParaSelecionar (imagemJogar (imagensMenu (menu estado))) (imagemSair (imagensMenu (menu estado))) estado
_ -> Blank
{-|
Função sobre as opções para selecionar no menu
-}
opcoesParaSelecionar :: Picture -> Picture -> EstadoProjeto -> Picture
opcoesParaSelecionar imgJogar imgSair estado = pictures
[ translate (-250) (-200) (scaleImage Jogar (imagemJogar (imagensMenu (menu estado))) estado),
translate 250 (-200) (scaleImage Sair (imagemSair (imagensMenu (menu estado))) estado)
]
where
scaleImage :: Menuescolher -> Picture -> EstadoProjeto -> Picture
scaleImage opcao img est =
scale (if opcaoEscolhida (menu est) == opcao then 0.6 else 0.5)
(if opcaoEscolhida (menu est) == opcao then 0.6 else 0.5)
(selecionar img (opcaoEscolhida (menu est) == opcao))
{-|
--função que transforma uma Maybe Picture em Picture
-}
loadJuicyToPicture :: IO (Maybe Picture) -> IO Picture
loadJuicyToPicture = fmap (fromMaybe blank)
{-|
--função que, tendo em conta se uma opcção está selecionada ou não, altera a cor da imagem
-}
selecionar :: Picture -> Bool -> Picture
selecionar img estaSelecionado = pictures
[ color (if estaSelecionado then blue else red) $ translate (-50) 50 img
]
{-|
--função que renderiza o jogo ajustando as coordenadas da janela
-}
renderizarJogo :: EstadoProjeto -> Picture
renderizarJogo estado = translate (cantoXSuperior (larguraJanela estado)) (cantoYSuperior (alturaJanela estado)) $
pictures [
criaMapa estado,
renderizarInimigos estado,
renderizarJogador estado,
desenhaEstrela estado ]
{-|
Função para renderizar o mapa
-}
criaMapa :: EstadoProjeto -> Picture
criaMapa estado = pictures $ concatMap renderizaLinha (zip [0..] blocos1)
where
(largura, altura) = (length (head blocos1), length blocos1)
renderizaLinha :: (Int, [Bloco]) -> [Picture]
renderizaLinha (l, b) = zipWith (curry (renderizaBloco l)) [0..] b
renderizaBloco :: Int -> (Int, Bloco) -> Picture
renderizaBloco l (c, b) =
translate
(fromIntegral c * realToFrac pixeisPorBloco + fromIntegral tamanhoBloco/2 )
(fromIntegral l * realToFrac (-pixeisPorBloco) - fromIntegral tamanhoBloco/2 ) $
case b of
Vazio -> imagemVazio (blocos estado)
Plataforma -> imagemPlataforma (blocos estado)
Escada -> imagemEscada (blocos estado)
Alcapao -> imagemAlcapao (blocos estado)
{-|
Função que renderiza os inimigos
-}
renderizarInimigos :: EstadoProjeto -> Picture
renderizarInimigos estadoprojeto = pictures listaInimigosPic
where
imagemDoFantasma = imagemFantasma (imagensPersonagem estadoprojeto)
imagemDoMacacoMalvado = imagemMacacoMalvado (imagensPersonagem estadoprojeto)
listaInimigosPic = [ translate 230 (-175) imagemDoFantasma, translate 220 (-70) imagemDoMacacoMalvado]
{-|
Função que renderiza o jogador
-}
renderizarJogador :: EstadoProjeto -> Picture
renderizarJogador estadoProjeto =
case direcaoJogador of
Este -> translate (convertX x) (convertY y ) $ scale (-2) 2 jogadorPic
Oeste -> translate (convertX x) (convertY y) $ scale 2 2 jogadorPic
Norte -> translate (convertX x) (convertY y) $ scale 2 2 jogadorPic
Sul -> translate (convertX x) (convertY y) $ scale 2 2 jogadorPic
where
(x, y) = posicao (jogador (jogo estadoProjeto))
jogadorPic = imagemJogador (imagensPersonagem estadoProjeto)
direcaoJogador = direcao (jogador (jogo estadoProjeto))
(lx, ly) = (fromIntegral (larguraJanela estadoProjeto), fromIntegral (alturaJanela estadoProjeto))
{-|
Local onde se vão localizar os colecionaveis iniciais e o tipo de colecionáveis que são
-}
colecionaveisInicial :: [(Colecionavel,Posicao)]
colecionaveisInicial = [(Martelo,(1.5,1.5)),(Moeda,(5.5,5.5))]
{-|
Os inimigos iniciais do jogo
-}
criaInimigosIniciais :: [Personagem]
criaInimigosIniciais = [macacoMalvado] ++ [fantasma1]
{-|
Exemplo de Macaco Malvado
-}
macacoMalvado :: Personagem
macacoMalvado = Personagem {
velocidade = (0,0),
tipo = MacacoMalvado,
posicao = ( 3.0 ,1.0),
direcao = Oeste,
tamanho = (1,1),
emEscada = False,
ressalta = True,
vida = 1,
pontos = 0,
aplicaDano = (True,0)
}
{-|
Exemplo de fantasma
-}
fantasma1 :: Personagem
fantasma1 = Personagem {
velocidade = (5,0),
tipo = Fantasma,
posicao = (160,100),
direcao = Este,
tamanho = (0.5,0.5),
emEscada = False,
ressalta = True,
vida = 1,
pontos = 0,
aplicaDano = (True,0)
}
{-|
Função que caracteriza o jogador inicial
-}
criaJogadorInicial :: Mapa -> Personagem
criaJogadorInicial (Mapa(posicaoInicial, direcao) _ _) = Personagem
{
velocidade = (0, 0),
tipo = Jogador,
posicao = posicaoInicial,
direcao = direcao,
tamanho = (0.9, 0.9),
emEscada = False,
ressalta = False,
vida = 0,
pontos = 0,
aplicaDano = (False, 0)
}
{-|
Função que renderiza os blocos, ou seja, vai buscar determinada imagem tendo em conta o tipo de bloco
-}
renderizaBlocos :: IO ImagensBloco
renderizaBlocos = do
maybeimagemPlataforma <- loadJuicy "ImagemPlataforma.bmp"
maybeimagemAlcapao <- loadJuicy "ImagemAlcapao.bmp"
maybeimagemVazio <- loadJuicy "ImagemEscada.bmp"
maybeimagemEscada <- loadJuicy "ImagemVazio.bmp"
imagemEstrela <- loadJuicy "imagemEstrela.png"
let imagemDefault = blank
let blocoPlataformaPic = scale 4 4 $ fromMaybe imagemDefault maybeimagemPlataforma
let blocoAlcapaoPic = scale 4 4 $ fromMaybe imagemDefault maybeimagemAlcapao
let blocoVazioPic = scale 4 4 $ fromMaybe imagemDefault maybeimagemVazio
let blocoEscadaPic = scale 4 4 $ fromMaybe imagemDefault maybeimagemEscada
let imagemEstrelaPic = scale 1 1 $ fromMaybe imagemDefault imagemEstrela
let blocos = ImagensBloco blocoPlataformaPic blocoAlcapaoPic blocoVazioPic blocoEscadaPic imagemEstrelaPic
return blocos
{-|
Função que renderiza todos os personagens
-}
renderizaPersonagens :: IO ImagensPersonagem
renderizaPersonagens = do
maybejogadorPics <- loadJuicy "imagemMarioParado.bmp"
maybefantasmaPics <- loadJuicy "ImagemFantasma.bmp"
maybemacacoPics <- loadJuicy "ImagemMacaco.bmp"
let imagemDefault = blank
let jogadorPic = scale 1 1 $ fromMaybe imagemDefault maybejogadorPics
let fantasmaPic = scale 2 2 $ fromMaybe imagemDefault maybefantasmaPics
let macacoPic = scale 1.5 1.5 $ fromMaybe imagemDefault maybemacacoPics
let imagensPersonagem = ImagensPersonagem { imagemJogador = jogadorPic,
imagemFantasma = fantasmaPic,
imagemMacacoMalvado = macacoPic }
return imagensPersonagem
{-|
Função que atualiza o jogo tendo em conta a passagem do tempo
-}
atualizarJogo :: Float -> EstadoProjeto -> EstadoProjeto
atualizarJogo variacaotempo estado@(EstadoProjeto {estadoAtual = estadoJogo}) = estado {
jogo = jogoAtualizado,
tempoTotal = tempoTotalAtualizado
}
where jogoAtualizado = movimenta 1 (realToFrac variacaotempo) ( jogo estado)
tempoTotalAtualizado = tempoTotal estado + variacaotempo
atualizarJogo _ estado = estado
desenhaEstrela :: EstadoProjeto -> Picture
desenhaEstrela estado = translate ( convertX x) (convertY y) imagemEstrelaPic
where
(x,y) = (10.5,2)
imagemEstrelaPic = imagemEstrela ( blocos estado)