const preact = require('preact'); const { Component } = require('preact'); const anime = require('animejs').default; const { connect } = require('preact-redux'); const { TIMES, COLOURS } = require('../../constants'); const { randomPoints } = require('../../utils'); // logarithmic spiral lifted from // https://upload.wikimedia.org/wikipedia/commons/5/5b/Logarithmic_spiral_(1).svg const addState = connect( function receiveState(state) { const { animCb } = state; return { animCb }; } ); function projectile(x, y, radius, colour) { return ( ); } class Sleep extends Component { constructor() { super(); this.animations = []; const points = randomPoints(30, 30, { x: -250, y: -150, width: 600, height: 600 }); this.charges = points.map(coord => projectile(coord[0], coord[1], 15, COLOURS.GREEN)); } render() { const path = 'M0,100 C100,100 100,100 200,100'; return ( {this.charges} ); } componentDidMount() { this.animations.push(anime({ targets: ['#sleep'], opacity: [ { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS * 0.2 }, ], easing: 'easeInOutSine', })); this.animations.push(anime({ targets: ['#sleep'], rotate: 180, easing: 'linear', loop: true, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS + TIMES.POST_SKILL_DURATION_MS, })); this.animations.push(anime({ targets: ['#stun'], opacity: [ { value: 0, delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.8, duration: TIMES.TARGET_DURATION_MS * 0.2 }, ], easing: 'easeInOutSine', })); /* this.animations.push(anime({ targets: ['#heal'], opacity: [ { value: 1, delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.7, duration: TIMES.TARGET_DURATION_MS * 0.3 }, { value: 0, delay: TIMES.POST_SKILL_DURATION_MS * 0.6, duration: TIMES.POST_SKILL_DURATION_MS * 0.4 }, ], easing: 'easeInOutSine', })); */ this.animations.push(anime({ targets: ['#charges'], opacity: 1, delay: anime.stagger(TIMES.TARGET_DURATION_MS * 0.015, { start: TIMES.TARGET_DELAY_MS }), easing: 'easeInOutSine', })); this.animations.push(anime({ targets: ['#charges'], cx: 0, cy: 0, delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS + TIMES.POST_SKILL_DURATION_MS * 0.75, duration: TIMES.POST_SKILL_DURATION_MS * 0.25, easing: 'easeInOutSine', })); } // 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(); } this.props.animCb && this.props.animCb(); } } module.exports = addState(Sleep);