Files
vibegif.direct-img.link/gen/mini/stork/deliver.js
T

37 lines
2.1 KiB
JavaScript

// stork flying with a bundle in its beak: its wings flap, it bobs, the bundle swings and the baby inside blinks
const{sin,cos,PI}=Math,T=2*PI
export const frames=24,delay=80,rim=3,rimColor='#111'
export default(c,t)=>{
const f=sin(T*t*2),a=.5+.85*f,sw=.18*sin(T*t*2-1.8),bl=t>.55&&t<.62
c.fillStyle=c.strokeStyle='#fff';c.lineWidth=6
c.translate(5,12)
c.translate(0,46-6*sin(T*t*2+1.2))
const shape=g=>{c.beginPath();g();c.fill();c.stroke()}
const wing=(x,y,r,k,ln)=>{
c.save();c.translate(x,y);c.rotate(r);c.scale(k,k)
c.beginPath();c.moveTo(14,6);c.bezierCurveTo(-10,-30,-74,-38,-108,-18)
c.quadraticCurveTo(-94,-8,-100,0);c.quadraticCurveTo(-86,0,-88,9);c.quadraticCurveTo(-74,8,-74,17);c.quadraticCurveTo(-60,14,-58,22);c.quadraticCurveTo(-24,24,14,6)
c.fill();c.stroke()
if(ln){c.strokeStyle='#111';c.lineWidth=3;for(const[x0,y0,x1,y1]of[[-100,0,-80,-17],[-88,9,-66,-10],[-74,17,-52,-2],[-58,22,-38,8]])c.beginPath(),c.moveTo(x0+3,y0-3),c.lineTo(x1,y1),c.stroke()}
c.restore()}
c.lineWidth=5;for(const[y,d]of[[118,0],[123,8]])c.beginPath(),c.moveTo(64,y),c.lineTo(30,y+8+d),c.stroke()
c.lineWidth=6
wing(130,94,a+.3,.82,0)
shape(()=>{c.moveTo(64,102);c.lineTo(34,92);c.lineTo(40,114);c.closePath()})
shape(()=>c.ellipse(104,108,56,30,-.1,0,T))
c.lineWidth=20;c.beginPath();c.moveTo(140,100);c.quadraticCurveTo(166,98,172,74);c.stroke();c.lineWidth=6
shape(()=>c.arc(176,70,18,0,T))
c.save();c.translate(204,83);c.rotate(sw)
shape(()=>{c.moveTo(-6,2);c.lineTo(-14,-12);c.lineTo(0,-4);c.lineTo(12,-14);c.lineTo(6,2)
c.bezierCurveTo(30,20,36,62,0,66);c.bezierCurveTo(-36,62,-30,20,-6,2)})
c.fillStyle=c.strokeStyle='#111';c.lineWidth=3;c.beginPath();c.arc(0,42,14,0,T);c.stroke()
for(const d of[-1,1])if(bl)c.beginPath(),c.arc(d*5.5,40,3.5,.15*PI,.85*PI),c.stroke()
else c.beginPath(),c.arc(d*5.5,41,3,0,T),c.fill()
c.beginPath();c.arc(0,46,4,.2*PI,.8*PI);c.stroke()
c.restore()
c.fillStyle=c.strokeStyle='#fff';c.lineWidth=6
shape(()=>{c.moveTo(186,62);c.lineTo(229,86);c.lineTo(188,80);c.closePath()})
wing(118,98,a,1,1)
c.fillStyle='#111';c.beginPath();c.arc(180,66,5,0,T);c.fill()
}