~starkingdoms/starkingdoms

ref: f73656c66fcec95e0957a7500c291926e0dcab2e starkingdoms/client/src/particle.ts -rw-r--r-- 2.1 KiB
f73656c6 — core the server currently does much nothing 2 years ago
                                                                                
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
import {global} from "./index";

export interface Particle {
    x: number,
    y: number,
    lifetime: number,
    timer: number,
    startSize: number,
    finalSize: number,
    startRotation: number,
    finalRotation: number,
    startOpacity: number,
    endOpacity: number,
    startR: number,
    endR: number,
    startG: number,
    endG: number,
    startB: number,
    endB: number,
    velocity_x: number,
    velocity_y: number
}

let particles: Particle[] = [];

export function createParticle(particle: Particle) {
    particles.push(particle);
}

function lerp(start: number, end: number, time: number): number {
    return start + time * (end - start);
}

export function drawParticle(particle: Particle) {
    let t = particle.timer / particle.lifetime;
    let size = lerp(particle.startSize, particle.finalSize, t);
    let rotation = lerp(particle.startRotation, particle.finalRotation, t);

    global.context.save();

    global.context.translate(particle.x - global.me!.x, particle.y - global.me!.y);

    global.context.rotate(rotation);

    let opacity = Math.trunc(lerp(particle.startOpacity, particle.endOpacity, t));
    let r = Math.trunc(lerp(particle.startR, particle.endR, t));
    let g = Math.trunc(lerp(particle.startG, particle.endG, t));
    let b = Math.trunc(lerp(particle.startB, particle.endB, t));

    global.context.fillStyle = `rgb(${r} ${g} ${b} / ${opacity}%)`;
    global.context.fillRect(-size/2, -size/2, size, size);

    global.context.restore();
}

export function drawParticles() {
    for (let i = 0; i < particles.length; i++) {
        drawParticle(particles[i]);
    }
}

export function tickParticles(delta: number) {
    let keptParticles = []
    for (let i = 0; i < particles.length; i++) {
        particles[i].timer += delta;

        particles[i].x += particles[i].velocity_x * delta;
        particles[i].y += particles[i].velocity_y * delta;

        if (!(particles[i].timer > particles[i].lifetime)) {
            keptParticles.push(particles[i]);
        }
    }
    particles = keptParticles;
}

export function tickAndDrawParticles(delta: number) {
    tickParticles(delta);
    drawParticles();
}