class armor extends creature { mass head; mass spine[]; mass bodyL[]; mass bodyR[]; float s; float sinWave; float muscleWave; vec headP; float headAng; float spineLength; float leftWave=1; float rightWave=1; float fatness=0; armor(penStroke ps) { type=2; ps.statistics(); fatness=.8; s=ps.totalLength/250; s=constrain(s,.6,2); int segments=int(ps.totalLength/20); segments=constrain(segments,10,18); spine=new mass[segments]; bodyL=new mass[segments]; bodyR=new mass[segments]; for(int i=0;i0) { spine[i].connectSpringTo(bodyL[i-1],.5); spine[i].connectSpringTo(bodyR[i-1],.5); } segSize*=.86; } for(int i=0;i1) { // bodyL[i].connectSpringTo(bodyL[i-2],spineDistance*2,.2); // bodyR[i].connectSpringTo(bodyR[i-2],spineDistance*2,.2); } } for(int i=0;i0) { float delta=sin(muscleWave+i*.5)*4; sfDouble(bodyL[i],bodyL[i-1],spineLength+delta*leftWave,.7); sfDouble(bodyR[i],bodyR[i-1],spineLength+delta*rightWave,.7); } spine[i].update(); bodyL[i].update(); bodyR[i].update(); m=head; p=headP; } if(random(100)>98) { if(random(100)>50) leftWave+=random(-2,2); else rightWave+=random(-2,2); } leftWave+=(1-leftWave)/100; rightWave+=(1-rightWave)/100; sinWave+=s/30; muscleWave+=s/15; headAng=getAng(spine[1].p,spine[0].p); headP=spine[0].p; head=spine[0]; pullHead(); } void pullHead() { vec vf=newVec(headP,headAng+random(-3,3),6*s); sfSingle(head,new mass(vf),0,.5); } void draw() { noFill(); float dt=30*(s+.3); float sx=25*(s-.4); float sy=12*(s-.4); stroke(100*sin(sinWave)+160); vec p1=newVec(headP,headAng+50,dt); pushMatrix(); translate(p1.x,p1.y); rotate(radians(90-headAng-50)); ellipse(0,0,sx,sy); popMatrix(); vec p2=newVec(headP,headAng-50,dt); pushMatrix(); translate(p2.x,p2.y); rotate(radians(90-headAng+50)); ellipse(0,0,sx,sy); popMatrix(); vec p3=newVec(headP,headAng,dt); pushMatrix(); translate(p3.x,p3.y); rotate(radians(90-headAng)); ellipse(0,0,sx,sy); popMatrix(); for(int i=0;i0) ang=getAng(bodyL[i].p,bodyR[i].p)-90; // ang=getAng(spine[i].p,spine[i-1].p); else ang=headAng; float len=dist(bodyL[i].p,bodyR[i].p); pushMatrix(); translate(spine[i].p.x,spine[i].p.y); rotate(radians(90-ang)); float ss=s/2*len/100; scale(ss); int r=int(ss*30); r=constrain(r,3,7); stroke(200); pushMatrix(); translate(0,35); image(armorBodyDetail2,origin,r-1); popMatrix(); stroke(120); pushMatrix(); translate(0,-15); if(i==0) scale(.6+(sin(sinWave+i/2)/3)); else scale(.8+(sin(sinWave+i/2)/3)); image(armorBodyDetail,origin,r-1); popMatrix(); stroke(40); if(i==0) image(armorHeadBase,origin,r+1); else image(armorBodyBase,origin,r); popMatrix(); } // drawMasses(spine); // drawMasses(bodyL); // drawMasses(bodyR); } }