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); } }