Skip to content

Commit b2fe94e

Browse files
authored
Merge pull request #6 from klaseca/excalibur
perf(excalibur): switch particle system from Actors to GraphicsGroup
2 parents cbef763 + d6a9650 commit b2fe94e

File tree

1 file changed

+51
-35
lines changed

1 file changed

+51
-35
lines changed

src/scripts/excalibur.js

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
import * as ex from 'excalibur';
22
import Engine from './engine.js';
33

4+
const spriteImage = new ex.ImageSource('sprite.png');
5+
6+
const loader = new ex.Loader([spriteImage]);
7+
48
export class Scene extends ex.Scene {
9+
onInitialize() {
10+
this.sprite = spriteImage.toSprite();
11+
}
12+
513
onActivate(ctx) {
6-
const engine = ctx.engine;
714
this.engine = ctx.data.engine;
815

916
this.clear();
1017

1118
// Particle creation
12-
const particles = new Array(this.engine.count);
19+
const particles = Array.from({ length: this.engine.count });
1320
const rnd = [1, -1];
14-
const spriteImage = new ex.ImageSource('sprite.png');
15-
spriteImage.load();
21+
22+
const graphicsGroup = new ex.GraphicsGroup({ members: [] });
23+
1624
for (let i = 0; i < this.engine.count; i++) {
1725
const size = 10 + Math.random() * 80;
1826
const x = Math.random() * this.engine.width;
@@ -22,15 +30,11 @@ export class Scene extends ex.Scene {
2230
3 * Math.random() * rnd[Math.floor(Math.random() * 2)],
2331
];
2432

25-
const particle = new ex.Actor({
26-
x: x,
27-
y: y,
28-
radius: size,
29-
});
30-
3133
if (this.engine.type === 'sprite') {
32-
const sprite = ex.Sprite.from(spriteImage);
33-
particle.graphics.use(sprite);
34+
graphicsGroup.members.push({
35+
graphic: this.sprite,
36+
offset: ex.vec(x, y),
37+
});
3438
} else {
3539
const circle = new ex.Circle({
3640
x: x,
@@ -46,26 +50,36 @@ export class Scene extends ex.Scene {
4650
: ex.Color.fromRGB(0, 0, 0),
4751
strokeWidth: this.engine.type === 'stroke' ? 1 : undefined,
4852
});
49-
particle.graphics.use(circle);
53+
graphicsGroup.members.push({
54+
graphic: circle,
55+
offset: ex.vec(x, y),
56+
});
5057
}
51-
this.add(particle);
52-
53-
particles[i] = { x, y, size: size, dx, dy, el: particle };
54-
55-
particle.on("postupdate", () => {
56-
const r = particles[i];
57-
r.x -= r.dx;
58-
r.y -= r.dy;
59-
if (r.x + r.size < 0) r.dx *= -1;
60-
else if (r.y + r.size < 0) r.dy *= -1;
61-
if (r.x > engine.screen.drawWidth) r.dx *= -1;
62-
else if (r.y > engine.screen.drawHeight) r.dy *= -1;
63-
r.el.pos.x = r.x;
64-
r.el.pos.y = r.y;
65-
});
58+
59+
particles[i] = { x, y, size: size, dx, dy, el: graphicsGroup.members[i] };
6660
}
61+
62+
const screenElement = new ex.ScreenElement();
63+
64+
screenElement.graphics.use(graphicsGroup);
65+
66+
this.add(screenElement);
67+
68+
this.particles = particles;
6769
}
68-
onPostUpdate() {
70+
71+
onPostUpdate(engine) {
72+
for (let i = 0; i < this.engine.count; i++) {
73+
const r = this.particles[i];
74+
r.x -= r.dx;
75+
r.y -= r.dy;
76+
if (r.x + r.size < 0) r.dx *= -1;
77+
else if (r.y + r.size < 0) r.dy *= -1;
78+
if (r.x > engine.screen.drawWidth) r.dx *= -1;
79+
else if (r.y > engine.screen.drawHeight) r.dy *= -1;
80+
r.el.offset.setTo(r.x, r.y);
81+
}
82+
6983
this.engine.fpsmeter.tick();
7084
}
7185
}
@@ -77,25 +91,27 @@ class ExcaliburEngine extends Engine {
7791
window.cancelAnimationFrame(this.request);
7892
if (this.game) {
7993
this.game.dispose();
80-
this.canvas = document.createElement("canvas");
81-
this.canvas.id = "canvas";
82-
this.canvas.className = "canvas";
94+
this.canvas = document.createElement('canvas');
95+
this.canvas.id = 'canvas';
96+
this.canvas.className = 'canvas';
8397
this.canvas.width = this.width;
8498
this.canvas.height = this.height;
85-
document.querySelector("main").appendChild(this.canvas);
99+
document.querySelector('main').appendChild(this.canvas);
86100
}
87101

88102
const game = new ex.Engine({
89103
width: this.width,
90104
height: this.height,
91105
canvasElement: this.canvas,
92106
backgroundColor: ex.Color.fromRGB(26, 26, 26),
93-
scenes: { scene: Scene }
107+
suppressPlayButton: true,
108+
physics: { enabled: false },
109+
scenes: { scene: Scene },
94110
});
95111
this.game = game;
96112
}
97113
render() {
98-
this.game.start().then(() => {
114+
this.game.start(loader).then(() => {
99115
this.game.goToScene('scene', { sceneActivationData: { engine: this } });
100116
});
101117
}

0 commit comments

Comments
 (0)