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.
167 lines
4.6 KiB
167 lines
4.6 KiB
2 years ago
|
"use strict";
|
||
|
class Decoration {
|
||
|
constructor(properties) {
|
||
|
this.pos = p.createVector();
|
||
|
this.isTaken = false;
|
||
|
this.isBoundToMouse = false;
|
||
|
this.isToDelete = false;
|
||
|
this.needsValidation = false;
|
||
|
this.isSelected = false;
|
||
|
for (let key in properties) {
|
||
|
if (properties.hasOwnProperty(key)) {
|
||
|
if (Array.isArray(properties[key])) {
|
||
|
this[key] = arrayCopy(properties[key]);
|
||
|
}
|
||
|
else {
|
||
|
this[key] = properties[key];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
get properties() {
|
||
|
let colors = [];
|
||
|
for (let i = 0; i < this.colors.length; i++) {
|
||
|
let color = [];
|
||
|
for (let c of this.colors[i]) {
|
||
|
color.push(c);
|
||
|
}
|
||
|
colors.push(color);
|
||
|
}
|
||
|
return {
|
||
|
radius: this.radius,
|
||
|
colors: colors,
|
||
|
type: this.type
|
||
|
};
|
||
|
}
|
||
|
get mouseIsOver() {
|
||
|
if (this.isTaken) {
|
||
|
let pos = this.realPos;
|
||
|
return p.dist(pos.x, pos.y, p.mouseX, p.mouseY) <= this.radius * game.tree.sizeMultiplier;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
get hasValidPosition() {
|
||
|
return game.tree.containsPosition(this.realPos, true);
|
||
|
}
|
||
|
get realPos() {
|
||
|
return p5.Vector.add(p5.Vector.mult(this.pos, game.tree.sizeMultiplier), game.center);
|
||
|
}
|
||
|
static Create(properties) {
|
||
|
switch (properties['type']) {
|
||
|
case 'ball':
|
||
|
return new Ball(properties);
|
||
|
case 'star':
|
||
|
return new Star(properties);
|
||
|
case 'chain':
|
||
|
return new Chain(properties);
|
||
|
}
|
||
|
}
|
||
|
display(pos, dim) {
|
||
|
let sizeMultiplier = this.sizeMultiplier;
|
||
|
if (pos || dim) {
|
||
|
sizeMultiplier = dim.y * 0.6;
|
||
|
}
|
||
|
else {
|
||
|
pos = this.pos;
|
||
|
}
|
||
|
p.push();
|
||
|
p.translate(pos);
|
||
|
p.scale(sizeMultiplier);
|
||
|
}
|
||
|
brightness(value) {
|
||
|
p.noStroke();
|
||
|
p.fill(0, 0, 0, value);
|
||
|
p.ellipse(0, 0, this.radius * 2, this.radius * 2);
|
||
|
}
|
||
|
update() {
|
||
|
if (!this.isTaken) {
|
||
|
this.pos = this.container.center;
|
||
|
this.sizeMultiplier = this.container.dim.y * 0.6;
|
||
|
}
|
||
|
else {
|
||
|
this.sizeMultiplier = 1;
|
||
|
}
|
||
|
if (this.isBoundToMouse) {
|
||
|
let x = (p.mouseX - game.center.x) / game.tree.sizeMultiplier, y = (p.mouseY - game.center.y) / game.tree.sizeMultiplier;
|
||
|
this.pos.set(x, y);
|
||
|
}
|
||
|
}
|
||
|
//Assumes mouse is over this
|
||
|
mousePressed() {
|
||
|
this.isBoundToMouse = true;
|
||
|
}
|
||
|
//Always called
|
||
|
mouseReleased() {
|
||
|
}
|
||
|
toJSON(index) {
|
||
|
let list = [
|
||
|
"pos",
|
||
|
"colors",
|
||
|
"radius",
|
||
|
"type"
|
||
|
];
|
||
|
let obj = {};
|
||
|
for (let item of list) {
|
||
|
obj[item] = this[item];
|
||
|
}
|
||
|
return obj;
|
||
|
}
|
||
|
static restoreFrom(rawDeco) {
|
||
|
let props = {};
|
||
|
for (let key in rawDeco) {
|
||
|
if (['pos', 'p1', 'p2'].find(s => s === key) === undefined) {
|
||
|
props[key] = rawDeco[key];
|
||
|
}
|
||
|
}
|
||
|
let deco = Decoration.Create(props);
|
||
|
deco.isTaken = true;
|
||
|
deco.pos.x = rawDeco['pos'].x;
|
||
|
deco.pos.y = rawDeco['pos'].y;
|
||
|
if (deco instanceof Chain) {
|
||
|
deco.p1.set(rawDeco['p1'].x, rawDeco['p1'].y);
|
||
|
deco.p2.set(rawDeco['p2'].x, rawDeco['p2'].y);
|
||
|
deco.generate();
|
||
|
}
|
||
|
return deco;
|
||
|
}
|
||
|
}
|
||
|
function darker(c) {
|
||
|
let newC = [];
|
||
|
for (let v of c) {
|
||
|
newC.push(p.constrain(v * 0.6, 0, 255));
|
||
|
}
|
||
|
return newC;
|
||
|
}
|
||
|
function arrayCopy(a) {
|
||
|
let newArr = [];
|
||
|
for (let c of a) {
|
||
|
let copy = c;
|
||
|
if (Array.isArray(c)) {
|
||
|
copy = arrayCopy(c);
|
||
|
}
|
||
|
newArr.push(copy);
|
||
|
}
|
||
|
return newArr;
|
||
|
}
|
||
|
function equals(a1, a2) {
|
||
|
// if the other array is a falsy value, return
|
||
|
if (!a1)
|
||
|
return false;
|
||
|
// compare lengths - can save a lot of time
|
||
|
if (a2.length != a1.length)
|
||
|
return false;
|
||
|
for (let i = 0, l = a2.length; i < l; i++) {
|
||
|
// Check if we have nested arrays
|
||
|
if (a2[i] instanceof Array && a1[i] instanceof Array) {
|
||
|
// recurse into the nested arrays
|
||
|
if (!a2[i].equals(a1[i]))
|
||
|
return false;
|
||
|
}
|
||
|
else if (a2[i] != a1[i]) {
|
||
|
// Warning - two different object instances will never be equal: {x:20} != {x:20}
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
//# sourceMappingURL=decoration.js.map
|