-
Notifications
You must be signed in to change notification settings - Fork 0
/
jumper.elm
135 lines (104 loc) · 2.32 KB
/
jumper.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import Color exposing (..)
import Debug
import Graphics.Collage exposing (..)
import Graphics.Element exposing (..)
import Keyboard
import Time exposing (..)
import Window
-- MODEL
type alias Model =
{ x : Float
, y : Float
, vx : Float
, vy : Float
, dir : Direction
}
type alias World = {xSize : Int, ySize : Int }
type Direction = Left | Right
type alias Keys = { x:Int, y:Int }
ball : Model
ball =
{ x = 0
, y = 0
, vx = 0
, vy = 0
, dir = Right
}
gameWorld : World
gameWorld =
{ x = 0
, y = 0
}
-- UPDATE
update : (Float, Keys) -> Model -> Model
update (dt, keys) ball =
ball
|> gravity dt
|> jump keys
|> walk keys
|> physics dt
jump : Keys -> Model -> Model
jump keys ball =
if keys.y > 0 && ball.vy == 0
then { ball | vy = 20.0 }
else ball
gravity : Float -> Model -> Model
gravity dt ball =
{ ball |
vy =
if ball.y > 0 then
ball.vy - dt/2
else if (ball.y == 0 && ball.vy < -8) then
-ball.vy * 0.8
else
0
}
physics : Float -> Model -> Model
physics dt ball =
{ ball |
x = ball.x + dt * ball.vx,
y = max 0 (ball.y + dt * ball.vy)
}
walk : Keys -> Model -> Model
walk keys ball =
{ ball |
vx = toFloat keys.x * 4,
dir =
if keys.x < 0 then
Left
else if keys.x > 0 then
Right
else
ball.dir
}
-- VIEW
view : (Int, Int) -> Model -> Element
view (w',h') ball =
let (w,h) = (toFloat w', toFloat h')
dir =
case ball.dir of
Left -> "left"
Right -> "right"
groundY = 50 - h/2
position = (ball.x, ball.y + groundY)
in
collage w' h'
[ rect w h
|> filled (rgb 0 0 0)
, rect w 50
|> filled (rgb 145 156 100)
|> move (0, 20-h/2)
, oval 10 10
|> filled (rgb 200 200 200)
|> move position
]
-- SIGNALS
main : Signal Element
main =
Signal.map2 view Window.dimensions (Signal.foldp update ball input)
input : Signal (Float, Keys)
input =
let delta = Signal.map (\t -> t/10) (fps 30)
deltaArrows = Signal.map2 (,) delta Keyboard.arrows
in
Signal.sampleOn delta deltaArrows