diff --git a/client/src/components/anims/decay.jsx b/client/src/components/anims/decay.jsx new file mode 100644 index 00000000..206457eb --- /dev/null +++ b/client/src/components/anims/decay.jsx @@ -0,0 +1,68 @@ +const preact = require('preact'); +const { Component } = require('preact'); +const anime = require('animejs').default; + +const { TIMES } = require('../../constants'); + +class Decay extends Component { + constructor() { + super(); + this.animations = []; + } + + render() { + return ( + + + + + + + + + + + + + + + ); + } + + componentDidMount() { + this.animations.push(anime({ + targets: ['#decay'], + opacity: 1, + + easing: 'easeOutExpo', + delay: TIMES.TARGET_DELAY_MS, + duration: TIMES.TARGET_DELAY_MS, + })); + + this.animations.push(anime({ + targets: ['#decay rect'], + transform: () => `translate(${anime.random(-100, 100)} ${anime.random(-100, 100)}) rotate(${anime.random(-15, 15)})`, + opacity: 0, + easing: 'linear', + delay: TIMES.TARGET_DELAY_MS, + duration: TIMES.START_SKILL, + })); + } + + // this is necessary because + // skipping / timing / unmounting race conditions + // can cause the animations to cut short, this will ensure the values are reset + // because preact will recycle all these components + componentWillUnmount() { + for (let i = this.animations.length - 1; i >= 0; i--) { + this.animations[i].reset(); + } + } +} + +module.exports = Decay;