ngx-screen-saver
Version:
Screen saver component for Angular.
68 lines • 10.7 kB
JavaScript
import { randomHslFromRange } from '../../utils/random-hsl-from-range';
import { reverseLoop } from '../../utils/reverse-loop';
import { Particle } from './particle';
export class Firework {
constructor(p5, posX, maxHeight) {
this.p5 = p5;
this.posX = posX;
this.maxHeight = maxHeight;
this.pos = this.p5.createVector(this.posX, 0);
this.vel = this.p5.createVector(0, this.p5.random(1.5, 2.5));
this.randomHue = this.p5.random(0, 360);
this.phase = 'fly';
this.explosionParticlesCreated = false;
this.fireParticles = [];
this.explosionParticles = [];
}
update() {
this.p5.push();
this.p5.colorMode(this.p5.HSL);
if (this.phase === 'fly') {
this.pos.add(this.vel);
this.fireParticles.push(new Particle(this.p5, this.p5.createVector(this.pos.x + this.p5.random(-2, 2), this.pos.y + this.p5.random(-2, 2)), this.p5.createVector(0, 0), 3, randomHslFromRange(this.p5, 30, 20)));
if (this.fireParticles.length > 30) {
this.fireParticles.splice(0, 1);
}
if (this.pos.y >= this.maxHeight) {
this.phase = 'explode';
}
}
if (this.phase === 'explode') {
if (this.fireParticles.length > 0) {
this.fireParticles.splice(0, 1);
}
if (this.explosionParticlesCreated === false) {
for (let i = 0; i < 150; i++) {
const newParticle = new Particle(this.p5, this.pos.copy(), this.p5.createVector(1, 0), 5, randomHslFromRange(this.p5, this.randomHue, 20), this.p5.random(0, 360));
this.explosionParticles.push(newParticle);
}
this.explosionParticlesCreated = true;
}
if (this.explosionParticles.length <= 0) {
this.phase = 'dispose';
}
}
this.p5.pop();
}
draw() {
this.p5.noStroke();
if (this.fireParticles.length > 0) {
reverseLoop(this.fireParticles, (particle, idx) => {
particle.update();
particle.draw();
});
}
if (this.explosionParticles.length > 0) {
reverseLoop(this.explosionParticles, (particle, idx) => {
if (this.pos.dist(particle.pos) <= 50) {
particle.update();
particle.draw();
}
else {
this.explosionParticles.splice(idx, 1);
}
});
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZXdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NyZWVuLXNhdmVyL3NyYy9saWIvc2NyZWVuLXNhdmVycy9maXJld29ya3MvZmlyZXdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEMsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFBb0IsRUFBTSxFQUFTLElBQVksRUFBUyxTQUFpQjtRQUFyRCxPQUFFLEdBQUYsRUFBRSxDQUFJO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFFekUsUUFBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RCxjQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLFVBQUssR0FBa0MsS0FBSyxDQUFDO1FBRTdDLDhCQUF5QixHQUFZLEtBQUssQ0FBQztRQUUzQyxrQkFBYSxHQUFlLEVBQUUsQ0FBQztRQUMvQix1QkFBa0IsR0FBZSxFQUFFLENBQUM7SUFYd0MsQ0FBQztJQWE3RSxNQUFNO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxFQUFFLENB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TUFBTSxFQUFFLENBQUM7Z0JBQ2xCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3JDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEIsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNqQjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDeEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHA1IGZyb20gJ3A1JztcclxuaW1wb3J0IHsgcmFuZG9tSHNsRnJvbVJhbmdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmFuZG9tLWhzbC1mcm9tLXJhbmdlJztcclxuaW1wb3J0IHsgcmV2ZXJzZUxvb3AgfSBmcm9tICcuLi8uLi91dGlscy9yZXZlcnNlLWxvb3AnO1xyXG5pbXBvcnQgeyBQYXJ0aWNsZSB9IGZyb20gJy4vcGFydGljbGUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpcmV3b3JrIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHA1OiBwNSwgcHVibGljIHBvc1g6IG51bWJlciwgcHVibGljIG1heEhlaWdodDogbnVtYmVyKSB7fVxyXG5cclxuICBwb3MgPSB0aGlzLnA1LmNyZWF0ZVZlY3Rvcih0aGlzLnBvc1gsIDApO1xyXG4gIHZlbCA9IHRoaXMucDUuY3JlYXRlVmVjdG9yKDAsIHRoaXMucDUucmFuZG9tKDEuNSwgMi41KSk7XHJcbiAgcmFuZG9tSHVlID0gdGhpcy5wNS5yYW5kb20oMCwgMzYwKTtcclxuXHJcbiAgcGhhc2U6ICdmbHknIHwgJ2V4cGxvZGUnIHwgJ2Rpc3Bvc2UnID0gJ2ZseSc7XHJcblxyXG4gIGV4cGxvc2lvblBhcnRpY2xlc0NyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZmlyZVBhcnRpY2xlczogUGFydGljbGVbXSA9IFtdO1xyXG4gIGV4cGxvc2lvblBhcnRpY2xlczogUGFydGljbGVbXSA9IFtdO1xyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICB0aGlzLnA1LnB1c2goKTtcclxuICAgIHRoaXMucDUuY29sb3JNb2RlKHRoaXMucDUuSFNMKTtcclxuXHJcbiAgICBpZiAodGhpcy5waGFzZSA9PT0gJ2ZseScpIHtcclxuICAgICAgdGhpcy5wb3MuYWRkKHRoaXMudmVsKTtcclxuXHJcbiAgICAgIHRoaXMuZmlyZVBhcnRpY2xlcy5wdXNoKFxyXG4gICAgICAgIG5ldyBQYXJ0aWNsZShcclxuICAgICAgICAgIHRoaXMucDUsXHJcbiAgICAgICAgICB0aGlzLnA1LmNyZWF0ZVZlY3RvcihcclxuICAgICAgICAgICAgdGhpcy5wb3MueCArIHRoaXMucDUucmFuZG9tKC0yLCAyKSxcclxuICAgICAgICAgICAgdGhpcy5wb3MueSArIHRoaXMucDUucmFuZG9tKC0yLCAyKVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHRoaXMucDUuY3JlYXRlVmVjdG9yKDAsIDApLFxyXG4gICAgICAgICAgMyxcclxuICAgICAgICAgIHJhbmRvbUhzbEZyb21SYW5nZSh0aGlzLnA1LCAzMCwgMjApXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmlyZVBhcnRpY2xlcy5sZW5ndGggPiAzMCkge1xyXG4gICAgICAgIHRoaXMuZmlyZVBhcnRpY2xlcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnBvcy55ID49IHRoaXMubWF4SGVpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5waGFzZSA9ICdleHBsb2RlJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBoYXNlID09PSAnZXhwbG9kZScpIHtcclxuICAgICAgaWYgKHRoaXMuZmlyZVBhcnRpY2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5maXJlUGFydGljbGVzLnNwbGljZSgwLCAxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZXhwbG9zaW9uUGFydGljbGVzQ3JlYXRlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE1MDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdQYXJ0aWNsZSA9IG5ldyBQYXJ0aWNsZShcclxuICAgICAgICAgICAgdGhpcy5wNSxcclxuICAgICAgICAgICAgdGhpcy5wb3MuY29weSgpLFxyXG4gICAgICAgICAgICB0aGlzLnA1LmNyZWF0ZVZlY3RvcigxLCAwKSxcclxuICAgICAgICAgICAgNSxcclxuICAgICAgICAgICAgcmFuZG9tSHNsRnJvbVJhbmdlKHRoaXMucDUsIHRoaXMucmFuZG9tSHVlLCAyMCksXHJcbiAgICAgICAgICAgIHRoaXMucDUucmFuZG9tKDAsIDM2MClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy5leHBsb3Npb25QYXJ0aWNsZXMucHVzaChuZXdQYXJ0aWNsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmV4cGxvc2lvblBhcnRpY2xlc0NyZWF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5leHBsb3Npb25QYXJ0aWNsZXMubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICB0aGlzLnBoYXNlID0gJ2Rpc3Bvc2UnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wNS5wb3AoKTtcclxuICB9XHJcblxyXG4gIGRyYXcoKSB7XHJcbiAgICB0aGlzLnA1Lm5vU3Ryb2tlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZmlyZVBhcnRpY2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldmVyc2VMb29wKHRoaXMuZmlyZVBhcnRpY2xlcywgKHBhcnRpY2xlLCBpZHgpID0+IHtcclxuICAgICAgICBwYXJ0aWNsZS51cGRhdGUoKTtcclxuICAgICAgICBwYXJ0aWNsZS5kcmF3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmV4cGxvc2lvblBhcnRpY2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldmVyc2VMb29wKHRoaXMuZXhwbG9zaW9uUGFydGljbGVzLCAocGFydGljbGUsIGlkeCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBvcy5kaXN0KHBhcnRpY2xlLnBvcykgPD0gNTApIHtcclxuICAgICAgICAgIHBhcnRpY2xlLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgcGFydGljbGUuZHJhdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmV4cGxvc2lvblBhcnRpY2xlcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=