-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfireworks.js
112 lines (97 loc) · 2.57 KB
/
fireworks.js
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
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var particles;
var m = 1;
var g = 10;
var k = 0.005;
var vx = 150;
var vy = -100;
var numSparks = 10; // number of sparks per explosion
var minLife = 2; // minimum lifetime of sparks in seconds
var maxLife = 4; // maximum lifetime of sparks in seconds
var duration = 6; // maximum duration of fireworks in seconds
var fps = 30; // controls rate of creation of particles
var t0, t, dt;
var acc, force;
var posEmitter;
window.onload = init;
function init() {
particles = new Array();
posEmitter = new Vector2D(0.5 * canvas.width, 200);
createNewParticles(posEmitter, 255, 255, 0);
t0 = new Date().getTime();
t = 0;
animFrame();
}
function animFrame() {
setTimeout(function () {
animId = requestAnimationFrame(animFrame, canvas);
onTimer();
}, 1000 / fps);
}
function onTimer() {
var t1 = new Date().getTime();
dt = 0.001 * (t1 - t0);
t0 = t1;
if (dt > 0.2) {
dt = 0;
};
t += dt;
move();
}
function move() {
context.clearRect(0, 0, canvas.width, canvas.height);
// createNewParticles(posEmitter);
for (var i = 0; i < particles.length; i++) {
var particle = particles[i];
modifyObject(particle, i);
moveObject(particle);
calcForce(particle);
updateAccel();
updateVelo(particle);
}
}
function createNewParticles(ppos, r, g, b) {
for (var i = 0; i < numSparks; i++) {
var newParticle = new Spark(2, r, g, b, 1, m);
setProperties(newParticle, ppos);
particles.push(newParticle);
}
}
function setProperties(obj, ppos) {
obj.pos2D = ppos;
obj.velo2D = new Vector2D((Math.random() - 0.5) * vx, (Math.random() - 0.5) * vy);
obj.lifetime = minLife + (maxLife - minLife) * Math.random();
obj.age = 0;
}
function modifyObject(obj, i) {
obj.alpha += -0.01;
obj.age += dt;
if (obj.age > obj.lifetime) {
if (t < duration) {
explode(obj);
}
removeObject(i);
}
}
function explode(obj) {
createNewParticles(obj.pos2D, 0, 255, 0);
}
function removeObject(num) {
particles.splice(num, 1);
}
function moveObject(obj) {
obj.pos2D = obj.pos2D.addScaled(obj.velo2D, dt);
obj.draw(context);
}
function calcForce(obj) {
var gravity = Forces.constantGravity(m, g);
var drag = Forces.drag(k, obj.velo2D);
force = Forces.add([gravity, drag]);
}
function updateAccel() {
acc = force.multiply(1 / m);
}
function updateVelo(obj) {
obj.velo2D = obj.velo2D.addScaled(acc, dt);
}