Files

21 lines
1.2 KiB
JavaScript

// dumbo octopus paddling: it flaps its ear fins, its webbed skirt puffs open and shut, it bobs and blinks
const{sin,PI}=Math,T=2*PI
export const frames=24,delay=80,rim=3,rimColor='#111'
export default(c,t)=>{
const w=sin(T*t*2),p=sin(T*t*2-1.2),bl=t>.4&&t<.46
c.fillStyle=c.strokeStyle='#fff';c.lineWidth=6
const shape=f=>{c.beginPath();f();c.fill();c.stroke()}
c.translate(0,-7*sin(T*t*2-2))
for(const d of[-1,1]){c.save();c.translate(128+d*44,96);c.scale(d,1);c.rotate(-.45*w);shape(()=>c.ellipse(24,-6,28,15,-.3,0,T));c.restore()}
const W=52+10*p,Y=198-6*p,X=[0,1,2,3,4,5].map(k=>128-W+k*W*2/5),Yk=X.map(x=>Y-14*((x-128)/W)**2)
shape(()=>{c.moveTo(82,128);c.quadraticCurveTo(70,170,X[0],Yk[0])
for(let k=1;k<6;k++)c.quadraticCurveTo((X[k-1]+X[k])/2,Y-22,X[k],Yk[k])
c.quadraticCurveTo(186,170,174,128)})
shape(()=>c.ellipse(128,110,52,50,0,0,T))
c.fillStyle=c.strokeStyle='#111';c.lineWidth=3
for(const k of[1,2,3,4])c.beginPath(),c.moveTo(128+(X[k]-128)*.5,160),c.lineTo(X[k],Yk[k]-8),c.stroke()
for(const d of[-1,1])if(bl)c.lineWidth=3.5,c.beginPath(),c.arc(128+d*20,120,6.5,.15*PI,.85*PI),c.stroke()
else c.beginPath(),c.arc(128+d*20,122,6.5,0,T),c.fill()
c.lineWidth=3;c.beginPath();c.arc(128,134,6,.2*PI,.8*PI);c.stroke()
}