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.

146 lines
4.9 KiB

2 years ago
"use strict";
var has = Reflect.has;
class Chain extends Decoration {
constructor(properties) {
super(properties);
this.p1 = p.createVector(-0.65, 0);
this.p2 = p.createVector(0.65, 0);
this.p1IsBoundToMouse = false;
this.p2IsBoundToMouse = false;
this.placedOnce = false;
this.points = [];
this.lights = [];
this.generate();
}
get properties() {
let obj = super.properties;
obj['p1'] = this.p1;
obj['p2'] = this.p2;
return obj;
}
generate() {
let d = p.dist(this.p1.x, this.p1.y, this.p2.x, this.p2.y);
let m = p.abs((this.p2.y - this.p1.y) / (this.p2.x - this.p1.x));
let a = -1 / d - m / 10;
let b = (this.p1.y - this.p2.y + a * p.pow(this.p2.x, 2) - a * p.pow(this.p1.x, 2)) /
(this.p1.x - this.p2.x);
if (this.p1.x - this.p2.x === 0)
b = 0;
let c = this.p1.y - a * p.pow(this.p1.x, 2) - b * this.p1.x;
let func = x => a * x * x + b * x + c;
let detail = 40;
let points = [];
for (let i = 0; i <= detail; i++) {
let point = { x: 0, y: 0 };
point.x = this.p1.x + (this.p2.x - this.p1.x) / detail * i;
point.y = func(point.x);
points.push(point);
}
let lightDist = 0.35;
let lastLight = { x: Infinity, y: Infinity };
let lights = [];
detail = 300;
for (let i = 0; i <= detail; i++) {
let point = { x: 0, y: 0, hasLight: false };
point.x = this.p1.x + (this.p2.x - this.p1.x) / detail * i;
point.y = func(point.x);
if (p.dist(point.x, point.y, lastLight.x, lastLight.y) >= lightDist) {
lights.push(point);
lastLight = point;
}
}
this.points = points;
this.lights = lights;
}
display(pos, dim) {
super.display(pos, dim);
p.strokeWeight(0.05);
p.stroke(0);
p.noFill();
p.beginShape();
for (let point of this.points)
p.vertex(point.x, point.y);
p.endShape();
p.strokeWeight(0.01);
let i = 0;
for (let point of this.lights) {
let colorIndex = (i + p.int(p.frameCount / 30)) % this.colors.length;
p.fill(this.colors[colorIndex]);
p.ellipse(point.x, point.y, 0.2, 0.2);
i++;
}
p.pop();
}
get hasValidPosition() {
return game.tree.containsPosition(this.realPosByAnchor(this.p1), true)
&& game.tree.containsPosition(this.realPosByAnchor(this.p2), true);
}
realPosByAnchor(anchor) {
return p5.Vector.add(p5.Vector.mult(p5.Vector.add(this.pos, anchor), game.tree.sizeMultiplier), game.center);
}
realPointDistToAnchor(point, anchor) {
let pos = this.realPosByAnchor(anchor);
return p.dist(pos.x, pos.y, point.x, point.y);
}
isMouseOverAnchor(anchor) {
return this.realPointDistToAnchor(p.createVector(p.mouseX, p.mouseY), anchor) <= 0.5 * game.tree.sizeMultiplier;
}
get mouseIsOver() {
return this.isTaken && (this.isMouseOverAnchor(this.p1) || this.isMouseOverAnchor(this.p2));
}
//Mouse is over this
mousePressed() {
super.mousePressed();
if (this.isMouseOverAnchor(this.p1)) {
this.p1IsBoundToMouse = true;
}
else if (this.isMouseOverAnchor(this.p2)) {
this.p2IsBoundToMouse = true;
}
}
updateFromPoint(point, other, x, y) {
if (this.placedOnce) {
let pointRelative = p.createVector(x - this.pos.x, y - this.pos.y);
point.set(pointRelative);
let pointReal = p5.Vector.add(this.pos, point);
let otherReal = p5.Vector.add(this.pos, other);
let newPos = p5.Vector.div(p5.Vector.add(pointReal, otherReal), 2);
point.set(p5.Vector.sub(pointReal, newPos));
other.set(p5.Vector.mult(point, -1));
this.pos.set(newPos);
}
else {
this.pos.set(x - point.x, y - point.y);
}
}
update() {
let x = (p.mouseX - game.center.x) / game.tree.sizeMultiplier, y = (p.mouseY - game.center.y) / game.tree.sizeMultiplier;
if (this.isBoundToMouse) {
if (this.p1IsBoundToMouse) {
this.updateFromPoint(this.p1, this.p2, x, y);
}
if (this.p2IsBoundToMouse) {
this.updateFromPoint(this.p2, this.p1, x, y);
}
this.generate();
}
else {
super.update();
}
if (this.isTaken && !this.isBoundToMouse) {
this.placedOnce = true;
}
}
toJSON(index) {
let list = [
"p1",
"p2"
];
let obj = super.toJSON(index);
for (let item of list) {
obj[item] = this[item];
}
return obj;
}
}
//# sourceMappingURL=chain.js.map