From 662f3b00cac1cf140e0e10d6f6e087a434fe6317 Mon Sep 17 00:00:00 2001 From: ntr Date: Tue, 2 Jul 2019 13:08:37 +1000 Subject: [PATCH] electrify electrocute --- client/src/components/anims/electrify.jsx | 42 ++++---- client/src/components/anims/electrocute.jsx | 102 ++++++++++++++++++++ 2 files changed, 127 insertions(+), 17 deletions(-) create mode 100644 client/src/components/anims/electrocute.jsx diff --git a/client/src/components/anims/electrify.jsx b/client/src/components/anims/electrify.jsx index 18c676ee..37ac198d 100644 --- a/client/src/components/anims/electrify.jsx +++ b/client/src/components/anims/electrify.jsx @@ -22,7 +22,7 @@ class Electrify extends Component { version="1.1" id="electrify" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 128 128"> + viewBox="0 0 500 500"> @@ -34,13 +34,15 @@ class Electrify extends Component { ); @@ -56,24 +58,30 @@ class Electrify extends Component { easing: 'easeInOutSine', })); - const path = () => `M10,64 - L10,${anime.random(34, 94)} - L20,${anime.random(34, 94)} - L30,${anime.random(34, 94)} - L40,${anime.random(34, 94)} - L50,${anime.random(34, 94)} - L60,${anime.random(34, 94)} - L70,${anime.random(34, 94)} - L80,${anime.random(34, 94)} - L90,${anime.random(34, 94)} - L100,${anime.random(34, 94)} - L110,64 - `; + const path = () => { + const startX = anime.random(420, 440); + const startY = anime.random(180, 200); + return ` + M ${startX},${startY} + L ${anime.random(387, 407)},${anime.random(300, 320)} + L ${anime.random(300, 320)},${anime.random(387, 407)} + L ${anime.random(180, 200)},${anime.random(420, 440)} + L ${anime.random(60, 80)},${anime.random(387, 407)} + L ${anime.random(-27, 7)},${anime.random(300, 320)} + L ${anime.random(-20, -40)},${anime.random(180, 200)} + L ${anime.random(-27, 7)},${anime.random(60, 80)} + L ${anime.random(60, 80)},${anime.random(-27, 7)} + L ${anime.random(180, 200)},${anime.random(-20, -40)} + L ${anime.random(300, 320)},${anime.random(-27, 7)} + L ${anime.random(387, 407)},${anime.random(60, 80)} + L ${startX},${startY} + `; + }; this.animations.push(anime({ targets: ['#electrify path'], d: times(10, path), - easing: 'easeOutExpo', + easing: 'easeInOutSine', loop: true, duration: TIMES.TARGET_MAIN_DURATION / 5, })); diff --git a/client/src/components/anims/electrocute.jsx b/client/src/components/anims/electrocute.jsx new file mode 100644 index 00000000..4bf24bd8 --- /dev/null +++ b/client/src/components/anims/electrocute.jsx @@ -0,0 +1,102 @@ +const preact = require('preact'); +const { Component } = require('preact'); +const times = require('lodash/times') + +const anime = require('animejs').default; + +const { TIMES } = require('../../constants'); + +// shamelessly lifted from teh anime docs +// https://animejs.com/documentation/#svgAttr + +class Electrify extends Component { + constructor() { + super(); + this.animations = []; + } + + render() { + return ( + + + + + + + + + + + + + + ); + } + + componentDidMount() { + this.animations.push(anime({ + targets: ['#electrify'], + opacity: [ + { value: 1, delay: TIMES.TARGET_FADE_IN_DELAY, duration: TIMES.TARGET_FADE_IN_DURATION }, + { value: 0, delay: TIMES.TARGET_FADE_OUT_DELAY, duration: TIMES.FADE_OUT_DURATION }, + ], + easing: 'easeInOutSine', + })); + + const path = () => `M10,64 + L10,${anime.random(34, 94)} + L20,${anime.random(34, 94)} + L30,${anime.random(34, 94)} + L40,${anime.random(34, 94)} + L50,${anime.random(34, 94)} + L60,${anime.random(34, 94)} + L70,${anime.random(34, 94)} + L80,${anime.random(34, 94)} + L90,${anime.random(34, 94)} + L100,${anime.random(34, 94)} + L110,64 + `; + + this.animations.push(anime({ + targets: ['#electrify path'], + d: times(10, path), + easing: 'easeInOutSine', + loop: true, + duration: TIMES.TARGET_MAIN_DURATION / 5, + })); + + this.animations.push(anime({ + targets: ['#electrify path.white'], + strokeWidth: [2, 1], + easing: 'easeInOutSine', + direction: 'alternate', + loop: true, + duration: TIMES.TARGET_MAIN_DURATION, + })); + } + + // 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 = Electrify;