-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathPaddle.elm
125 lines (95 loc) · 2.81 KB
/
Paddle.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
module Paddle where
import Color exposing (blue, green, orange, red, white)
import Graphics.Collage exposing (Form, circle, collage, filled, group, move, moveY, rect)
import Graphics.Element exposing (Element, centered, container, empty, layers, middle)
import Keyboard
import Signal exposing ((<~), Signal, foldp, merge)
import Text as T
import Time exposing (Time, fps)
import Window
borders : Form
borders =
group [
rect 440 440 |> filled blue,
rect 400 420 |> filled white |> moveY -10
]
paddle : Float -> Form
paddle x =
rect (toFloat 100) (toFloat 20)
|> filled green
|> move (x,-210)
ball : Float -> Float -> Form
ball x y = filled orange (circle 10) |> move (x,y)
gameOver : Element
gameOver =
T.fromString "Game Over"
|> T.color red
|> T.bold
|> T.height 60
|> centered
|> container 440 440 middle
type alias State =
{
x: Float,
y: Float,
dx: Float,
dy: Float,
paddlex: Float,
paddledx: Float,
isOver: Bool
}
initialState : State
initialState =
{
x = 0,
y = 0,
dx = 0.14,
dy = 0.2,
paddlex = 0,
paddledx = 0,
isOver = False
}
view : State -> Element
view s =
layers [
collage 440 440 [
borders,
paddle s.paddlex,
ball s.x s.y
],
if s.isOver then gameOver else empty
]
type Event = Tick Time | PaddleDx Int
clockSignal : Signal Event
clockSignal = Tick <~ fps 100
keyboardSignal : Signal Event
keyboardSignal = (.x >> PaddleDx) <~ Keyboard.arrows
eventSignal : Signal Event
eventSignal = merge clockSignal keyboardSignal
gameSignal : Signal State
gameSignal = foldp step initialState <| eventSignal
step : Event -> State -> State
step event s =
if s.isOver
then s
else case event of
Tick time ->
{ s |
x <- s.x + s.dx*time,
y <- s.y + s.dy*time,
dx <- if (s.x >= 190 && s.dx > 0) ||
(s.x <= -190 && s.dx < 0)
then -1*s.dx
else s.dx,
dy <- if (s.y >= 190 && s.dy > 0) ||
(s.y <= -190 && s.dy < 0 &&
s.x >= s.paddlex - 50 &&
s.x <= s.paddlex + 50)
then -1*s.dy
else s.dy,
paddlex <- ((s.paddlex + s.paddledx*time) `max` -150) `min` 150,
isOver <- s.y < -200
}
PaddleDx dx -> { s | paddledx <- 0.1 * toFloat dx }
main : Signal Element
main = view <~ gameSignal