You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.3 KiB

2 years ago
class GrowingObject{
constructor(){
this.growing = true;
}
show(){
for (let i = 0; i < this.positions.length && this.positions[i + 1] != null; i++){
let p1 = p5.Vector.add(this.positions[i], this.pos.root);
let p2 = p5.Vector.add(this.positions[i + 1], this.pos.root);
strokeWeight((this.positions.length - i) / this.positions.length * this.width);
line(p1.x, p1.y, p2.x, p2.y);
}
}
grow(){
this.pos.current.add(this.vel);
this.vel.add(this.acc);
if (this.positions != null && this.width != null){
this.positions.push(this.pos.current.copy());
if (this.width < this.maxWidth) this.width++;
} else {
this.radius = this.pos.current.mag();
if (this.radius > this.maxRadius) this.growing = false;
}
}
}
class Palm extends GrowingObject{
constructor(x){
super();
this.pos = {root: createVector(x, getDesert(x)), current: createVector(0, 0)};
this.vel = createVector(0, random(-10, -12));
this.acc = createVector(random(-0.1, 0.1), 0.1);
this.positions = [this.pos.current.copy()];
colorMode(HSB);
this.color = color(35, random(30, 100), 35);
this.width = 0;
this.maxWidth = 40;
this.leaf = [];
let dispo = random(TWO_PI);
for (let i = 0; i < 8; i++){
let root = this.pos.root.copy();
let direction = i / 4 * PI + dispo;
this.leaf.push(new Leaf(direction, root));
}
this.coconuts = [];
}
update(){
let coconutsReady = true;
stroke(this.color);
this.show();
if (this.growing){
this.grow();
coconutsReady = false;
}
stroke(this.leaf[0].color);
for (let l of this.leaf){
if (this.growing) l.update(this.pos);
else l.update(null);
if (l.growing) coconutsReady = false;
}
if (this.coconuts.length > 0){
fill(this.coconuts[0].color);
stroke(0);
}
for (let c of this.coconuts) c.update();
if (abs(this.vel.x) > abs(this.vel.y)) this.growing = false;
if (coconutsReady && this.coconuts.length == 0) this.createCoconuts();
}
createCoconuts(){
let count = int(random(2, 8));
let dispo = random(TWO_PI);
for (let i = 0; i < count; i++){
let root = p5.Vector.add(this.pos.root, this.pos.current);
let direction = i / (count / 2) * PI + dispo;
this.coconuts.push(new Coconut(direction, root));
}
}
}
class Leaf extends GrowingObject{
constructor(direction, root){
super();
this.pos = {root: root, current: createVector(0, 0)};
this.vel = p5.Vector.mult(createVector(p5.Vector.fromAngle(direction).x, p5.Vector.fromAngle(direction).y), 6);
this.acc = createVector(0, 0.1);
this.positions = [this.pos.current.copy()];
colorMode(HSB);
this.color = color(135, 100, random(50, 80));
this.width = 0;
this.maxWidth = 40;
}
update(pos){
if (pos != null) this.pos.root.set(p5.Vector.add(pos.root, pos.current).x, p5.Vector.add(pos.root, pos.current).y);
this.show();
if (this.growing) this.grow();
if (this.positions.length > 40) this.growing = false;
}
}
class Coconut extends GrowingObject{
constructor(direction, root){
super();
this.pos = {root: root, current: createVector(0, 0)};
this.vel = p5.Vector.fromAngle(direction);
this.acc = createVector(0, 0);
this.radius = 0;
this.maxRadius = random(10, 20);
this.color = color("#6c4c2a");
}
update(){
if (this.growing) this.grow();
this.show();
}
show(){
let pos = p5.Vector.add(this.pos.root, this.pos.current);
ellipse(pos.x, pos.y, this.radius * 2);
}
}