-
Notifications
You must be signed in to change notification settings - Fork 1
/
Particles.elm
76 lines (54 loc) · 1.66 KB
/
Particles.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
module Particles where
import Graphics.Collage exposing (LineStyle, Form, defaultLine, segment, traced, group)
import Color exposing (..)
import Types exposing (Particle, Vector)
import Helpers exposing (..)
particleLife : Float
particleLife = 40
particleLifeDelta : Float
particleLifeDelta = 30
particleCount : Int
particleCount = 80
particleColor : Color
particleColor = white
init : List Particle
init = []
explosion : Vector -> List Particle
explosion (px, py) = List.map
(\i ->
let x = (cos (i*0.2)) + (cos (i*3.13)*0.15)
y = (sin (i*0.2)) + (sin (i*3.13)*0.2)
in
{ position = (px + x * 10, py + y * 10)
, speed = (x*3, y*3)
, life = particleLife + particleLifeDelta * (cos (i*1.42))
})
[0..(toFloat particleCount)]
particleStyle : Float -> LineStyle
particleStyle life =
{ defaultLine | color = (particleFade particleColor life)
, width = 1
}
particleFade : Color -> Float -> Color
particleFade col life =
let
c = toRgb col
fade x = round <| ((toFloat x)*life)/particleLife
in
rgb (fade c.red) (fade c.green) (fade c.blue)
draw : List Particle -> Form
draw particles =
let
drawp p = segment p.position (addvec p.position (mulvec p.speed 3))
|> traced (particleStyle p.life)
in
List.map drawp particles |> group
update : List Particle -> Float -> List Particle
update particles dt =
let
filter p = p.life > 0
step p = { p | position = mulvec p.speed dt |> addvec p.position
, life = p.life - 1
}
in
particles |> List.filter filter |> List.map step