xxxxxxxxxx
82
let hydra = null;
// [A,B,C] -> [ [a,b,c] , B , C ] -> ...
function setup() {
createCanvas(400, 400);
angleMode(DEGREES);
hydra = addHead(200,200,1);
}
function addHead(xx,yy,level,initialAngle=0){
let a,k,h;
h = [];
k = 80-level*20;
a = 30+initialAngle;
h.push({x:int(xx+k*cos(a)),y:int(yy+k*sin(a))});
a+=120;
h.push({x:int(xx+k*cos(a)),y:int(yy+k*sin(a))});
a+=120;
h.push({x:int(xx+k*cos(a)),y:int(yy+k*sin(a))});
return h;
}
function draw() {
background("darkred");
fill("white");
text('Prog-ctober 3rd - Cut one head... 3 will spawn!',50,14);
text('Things get scaly!!',50,26);
fill("rgb(30,108,23)");
drawHydra(hydra);
}
function drawHydra(h,level=0){
if (level>=6) return;
for (let i=0;i<3;i++){
if (h[i].x!=null){
fill( lerpColor(color(30,108,23), color(13,65,9), (level)/6) );
circle(h[i].x,h[i].y,120-level*20);
}
}
for (let i=0;i<3;i++){
if (h[i].x==null){
drawHydra(h[i],level+1);
}
}
}
let isDone;
function mousePressed(){
isDone = [false];
findAndChopClosestHead(hydra,mouseX,mouseY);
}
function findAndChopClosestHead(h,mx,my,level=0){
if (isDone[0]) return;
if (level>=6) return;
for (let i=0;i<3;i++){
if (h[i].x==null){
findAndChopClosestHead(h[i],mx,my,level+1);
}
}
for (let i=0;i<3;i++){
if (h[i].x!=null){
let d = dist(h[i].x,h[i].y,mx,my);
if (d<(120-level*20)/2){
h[i] = addHead( h[i].x,h[i].y,level+1,(1+level)*40);
isDone = [true];
return;
}
}
}
}