-
Notifications
You must be signed in to change notification settings - Fork 0
/
Run.hs
45 lines (33 loc) · 1.37 KB
/
Run.hs
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
module Run (Run, run, Geometrici (..), Grafici (..), Descrizione, Implementazione (..)) where
import Data.Tree (Tree)
import Data.Monoid (Monoid)
import Model (Pezzo (Pezzo), Punto (Punto), Assoluto, relativizza)
import View (Render, Colore, RenderHelp, renderWorld)
import Controller (World(World), Evento, mkWorld, catchEvento, updateTime)
data Geometrici = Ge
{ centroRotazioneX :: Float
, centroRotazioneY :: Float
, origineX :: Float
, origineY :: Float
, angolo :: Float
}
data Grafici = Gr
{ lunghezza :: Float
, schiacciamento :: Float
}
type Descrizione = Tree (Geometrici, Grafici)
mkPezzo :: Geometrici -> Pezzo Assoluto
mkPezzo (Ge x y xo yo beta) = (Pezzo (Punto (x,y)) (Punto (xo, yo)) alpha) where
alpha = beta * pi / 180
data Implementazione b e = Implementazione
{ mkSprite :: Grafici -> Render b
, colora :: Colore b
, mostraAiuto :: RenderHelp b
, catturaEvento :: e -> Evento
}
type Run b e = World -> (World -> b) -> (e -> World -> World) -> (Float -> World -> World) -> IO ()
run :: Monoid b => Run b e -> Implementazione b e -> Descrizione -> IO ()
run f (Implementazione mks co mo ca) de = f w rew cat updateTime where
rew = renderWorld co mo (fmap (mks . snd) de)
cat = catchEvento . ca
w = mkWorld (relativizza $ fmap (mkPezzo . fst) de)