xxxxxxxxxx
151
let walls = [];
let isPressed = false;
let p1;
let toggleGrid = false;
let deleteMode = false;
let buildMode = false;
let toggleGridB,deleteModeB,buildModeB;
//check if within rect
function withinBorders(x,y,bx1 = 0,by1 = 0,bx2 = width,by2 = height,show=false){
//display rect
if(show){
circle(bx1,by1,10);
circle(bx2,by2,10);
circle(x,y,10);
}
return (x >= bx1 && x <= bx2 && y >= by1 && y <= by2);
}
//return closest wall
function getClosestWall(x,y){
let checkSize = 0;
//loop through all walls
for(let i = 0; i < walls.length; i++){
let w = walls[i];
let dx = 10;
let dy = 10;
noFill();
//circle(w.a.x-dx,w.a.y-dy,5);
// circle(w.a.x+dx,w.a.y+dy,5);
// circle(w.b.x-dx,w.b.y-dy,5);
// circle(w.b.x+dx,w.b.y+dy,5);
//line(w.a.x-dx,w.a.y-dy,w.a.x-dx,w.a.x+dx);
//check if mouse is in rect around wall --NOT EFFECTIVE--
if(withinBorders(mouseX,mouseY,w.a.x,w.b.y,w.b.x,w.a.y,true)){
return i;
}
}
return -1;
}
//set up
function setup() {
createCanvas(400, 400);
toggleGridB = createButton('Toggle Grid');
deleteModeB = createButton('Delete Mode');
buildModeB = createButton('Build Mode');
toggleGridB.mousePressed(function(){toggleGrid = !toggleGrid; deleteMode = false; buildMode = false;});
deleteModeB.mousePressed(function(){toggleGrid = false; deleteMode = !deleteMode; buildMode = false;});
buildModeB.mousePressed(function(){toggleGrid = false; deleteMode = false; buildMode = !buildMode});
}
//draw
function draw() {
background(220);
//activate build mode
if(buildMode){
buildDisplay();
}
//activate delete mode
let index = -1;
//get index of closest wall
if(deleteMode){
index = getClosestWall();
}
//render walls
for(let i = 0; i < walls.length; i++){
//color wall red if closest
if(i == index){
walls[i].render(color(255,0,0));
}else{
walls[i].render();
}
}
}
//build
function buildDisplay(){
if(!isPressed){
noStroke();
fill(180)
circle(mouseX,mouseY,10);
}else{
fill(0)
circle(p1.x,p1.y,10);
circle(mouseX,mouseY,10);
stroke(0);
line(p1.x,p1.y,mouseX,mouseY);
}
}
function mousePressed(){
if(withinBorders(mouseX,mouseY)){
//build mode
if(buildMode){
p1 = createVector(mouseX,mouseY);
isPressed = true;
}
//delete mode
if(deleteMode){
let index = getClosestWall(mouseX,mouseY);
if(index != -1){
walls.splice(index,1);
}
}
}
}
function mouseReleased(){
if(withinBorders(mouseX,mouseY) && isPressed){
//build mode
if(buildMode){
append(walls, new Wall(p1.x,p1.y,mouseX,mouseY));
}
}
isPressed = false;
}
class Wall{
constructor(ax,ay,bx,by){
if(ax < bx){
this.a = createVector(ax,ay);
this.b = createVector(bx,by);
}else{
this.a = createVector(bx,by);
this.b = createVector(ax,ay);
}
}
render(clr = 0){
noStroke();
fill(clr);
circle(this.a.x,this.a.y,1);
circle(this.b.x,this.b.y,1);
stroke(clr);
line(this.a.x,this.a.y,this.b.x,this.b.y);
}
}