70 lines
1.4 KiB
JavaScript
70 lines
1.4 KiB
JavaScript
import {compose} from '@avocado/core';
|
|
import {Trait} from '@avocado/entity';
|
|
import {Property} from '@avocado/mixins';
|
|
import {Ticker} from '@avocado/timing';
|
|
|
|
const decorate = compose(
|
|
)
|
|
|
|
export class Emitter extends decorate(Trait) {
|
|
|
|
initialize() {
|
|
this.emitters = {};
|
|
this.ticker = new Ticker(1 / 10);
|
|
this.ticker.on('tick', (elapsed) => {
|
|
for (const key in this.emitters) {
|
|
const emitter = this.emitters[key];
|
|
emitter.tick(elapsed);
|
|
}
|
|
});
|
|
}
|
|
|
|
hooks() {
|
|
return {
|
|
|
|
afterDestructionTickers: () => {
|
|
return (elapsed) => {
|
|
for (const key in this.emitters) {
|
|
const emitter = this.emitters[key];
|
|
this.ticker.tick(elapsed);
|
|
if (!emitter.hasParticles()) {
|
|
delete this.emitters[key];
|
|
}
|
|
}
|
|
return 0 === Object.keys(this.emitters).length;
|
|
};
|
|
},
|
|
|
|
}
|
|
}
|
|
|
|
methods() {
|
|
return {
|
|
|
|
addEmitter: (key, emitter) => {
|
|
this.emitters[key] = emitter;
|
|
},
|
|
|
|
addEmitterRenderer: (key, renderer) => {
|
|
if (!this.emitters[key]) {
|
|
return;
|
|
}
|
|
this.emitters[key].addRenderer(renderer);
|
|
},
|
|
|
|
emitParticle: (key, ...args) => {
|
|
if (!this.emitters[key]) {
|
|
return;
|
|
}
|
|
this.emitters[key].emit(...args);
|
|
},
|
|
|
|
}
|
|
}
|
|
|
|
renderTick(elapsed) {
|
|
this.ticker.tick(elapsed);
|
|
}
|
|
|
|
}
|