-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathMario.elm
112 lines (87 loc) · 2.2 KB
/
Mario.elm
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
import Keyboard
import Window
import Debug
-- MODEL
type Model =
{ x : Float
, y : Float
, vx : Float
, vy : Float
, dir : Direction
}
data Direction = Left | Right
type Keys = { x:Int, y:Int }
mario : Model
mario =
{ x = 0
, y = 0
, vx = 0
, vy = 0
, dir = Right
}
-- UPDATE
step : (Float, Keys) -> Model -> Model
step (dt, keys) mario =
mario
|> gravity dt
|> jump keys
|> walk keys
|> physics dt
|> Debug.watch "mario"
jump : Keys -> Model -> Model
jump keys mario =
if keys.y > 0 && mario.vy == 0 then { mario | vy <- 6.0 } else mario
gravity : Float -> Model -> Model
gravity dt mario =
{ mario |
vy <- if mario.y > 0 then mario.vy - dt/4 else 0
}
physics : Float -> Model -> Model
physics dt mario =
{ mario |
x <- mario.x + dt * mario.vx,
y <- max 0 (mario.y + dt * mario.vy)
}
walk : Keys -> Model -> Model
walk keys mario =
{ mario |
vx <- toFloat keys.x,
dir <- if | keys.x < 0 -> Left
| keys.x > 0 -> Right
| otherwise -> mario.dir
}
-- DISPLAY
display : (Int, Int) -> Model -> Element
display (w',h') mario =
let (w,h) = (toFloat w', toFloat h')
verb = if | mario.y > 0 -> "jump"
| mario.vx /= 0 -> "walk"
| otherwise -> "stand"
dir = case mario.dir of
Left -> "left"
Right -> "right"
src = "imgs/mario/"++ verb ++ "/" ++ dir ++ ".gif"
marioImage = image 35 35 src
groundY = 62 - h/2
in
collage w' h'
[ rect w h
|> filled (rgb 174 238 238)
, rect w 50
|> filled (rgb 74 167 43)
|> move (0, 24 - h/2)
, marioImage
|> toForm
|> Debug.trace "mario"
|> move (mario.x, mario.y + groundY)
]
-- SIGNALS
main : Signal Element
main = lift2 display Window.dimensions (foldp step mario input)
input : Signal (Float, Keys)
input =
let delta = lift (\t -> t/20) (fps 25)
deltaArrows =
lift2 (,) delta (Debug.watch "arrows" <~ Keyboard.arrows)
in
sampleOn delta deltaArrows