UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

73 lines (62 loc) 2.09 kB
import Signal from "../../core/events/signal/Signal.js"; import Script from "../ecs/components/Script.js"; import TransitionFunctions from "./TransitionFunctions.js"; class Tween { timeElapsed = 0; on = { ended: new Signal() }; /** * * @param {function(value:number, timeDelta:number)} callback * @param {number} valueStart * @param {number} valueEnd * @param {number} duration time in seconds * @param {function(fraction:number):number} [formula=TransitionFunctions.Linear] * @param {boolean} [oscillate=false] */ constructor( callback, valueStart, valueEnd, duration, formula = TransitionFunctions.Linear, oscillate = false ) { this.oscillate = oscillate; this.formula = formula; const valueRange = valueEnd - valueStart; this.script = new Script( (timeDelta) => { this.timeElapsed += timeDelta; const timeElapsed = this.timeElapsed; const cycleWhole = Math.floor(timeElapsed / duration); const cycleFraction = (timeElapsed % duration) / duration; let state = cycleFraction; if (this.oscillate) { if (cycleWhole % 2 === 1) { state = 1 - cycleFraction; } } else { if (cycleWhole > 0) { state = 1; this.on.ended.dispatch(); //remove self this.destroy(); } } const y = this.formula(state); const value = y * valueRange + valueStart; callback(value, timeDelta); }); } destroy() { this.entityManager.removeEntity(this.entity); } build(em) { this.entityManager = em; this.entity = em.createEntity(); em.addComponentToEntity(this.entity, this.script); return this.entity; } } export default Tween;