Как удалить фигуру без использования фона (255); - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь заставить функцию drawRedlines появляться и исчезать внутри функций mousePressed и mouseReleased. Я пытался использовать фон (255);в моем mouseReleased, но он также по какой-то причине удаляет мою функцию crossBars. Я попытался изменить шнуры для прямоугольников RedLine на 0, но он все еще находится в том же положении, когда я отпускаю мышь.

final int NUM_LINES = 15;
final int LINE_THICK = 20;
final int CONVERGE_VERTICAL_OFFSET = 175;
final int CONVERGE_VERTICAL_OFFSET2 = 100;

int capSize = 20;
int width = 500;
int height = 500;
int x1 = 30;
int crossWidth = width - (30*2);
int y1 = height - 20;
int crossHeight = 20;
int capX = x1;
int capY = y1 + crossHeight/2;
int capX2 = width - x1;
int diffY = 60;
int diffX = 10;
int redLinex = 145;
int redLinex2 = 350;
int redLiney = 0;
int redlineHeight = height;
int redlineWidth = 5;

void setup(){
    size(500,500);
    drawConvergingvertical();
    horizontalCross();
    drawYellowlines();
}

void draw(){
}

void mousePressed(){
    drawRedlines();
}

void mouseReleased(){
    drawConvergingvertical();
    horizontalCross();
    drawYellowlines();
}

void horizontalCross(){
    for(int rows = 0; rows < NUM_LINES; rows++){
        //println(rows, capX, capX2); Used this to Debug;
        drawCrossbars();
        y1 = y1 - diffY;
        capY = capY - diffY - 1;
        x1 = x1 + diffX;
        capX = capX + diffX;
        crossWidth = crossWidth - diffX*2;
        capX2 = capX2 - diffX;
        crossHeight = crossHeight - 2;
        capSize = capSize - 2;
    }
}

void drawCrossbars(){
    rect(x1,y1,crossWidth,crossHeight);
    ellipse(capX,capY,capSize,capSize);
    ellipse(capX2,capY,capSize,capSize);
}

void drawConvergingvertical(){
    fill(0);
    stroke(0);
    quad(width/2-CONVERGE_VERTICAL_OFFSET,height,width/2-CONVERGE_VERTICAL_OFFSET2,0,width/2-CONVERGE_VERTICAL_OFFSET2+LINE_THICK,0,width/2-CONVERGE_VERTICAL_OFFSET+LINE_THICK,height);
    quad(width/2+CONVERGE_VERTICAL_OFFSET,height,width/2+CONVERGE_VERTICAL_OFFSET2,0,width/2+CONVERGE_VERTICAL_OFFSET2-LINE_THICK,0,width/2+CONVERGE_VERTICAL_OFFSET-LINE_THICK,height);
}

void drawYellowlines(){
    fill(255,255,0);
    stroke(255,255,0);
    rect(150, height - 100, 200, 10);
    rect(150, 100, 200, 10);
}

void drawRedlines(){
    redLinex = 145;
    redLinex2 = 350;
    redLiney = 0;
    redlineHeight = height;
    redlineWidth = 5;
    fill(255,0,0);
    stroke(255,0,0);
    rect(redLinex,redLiney,redlineWidth,redlineHeight);
    rect(redLinex2,redLiney,redlineWidth,redlineHeight);
}

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Как удалить фигуру без использования фона (255);[...]

Совсем нет. Вы не можете «удалить» то, что нарисовано в окне. Все, что вы можете сделать, это нарисовать что-то другое, что охватывает форму. background ничего не удаляет. Он просто рисует равномерный цвет во всем окне.
Вы должны перерисовать всю сцену в draw().

. Используйте встроенную переменную mousePressed, чтобы определить, нажата ли мышь ивызов drawRedlines() зависит от состояния переменной. Кроме того, вы должны сбросить состояние некоторых переменных в каждом кадре:

void draw() {

    capSize = 20;
    x1 = 30;
    crossWidth = width - (30*2);
    y1 = height - 20;
    crossHeight = 20;
    capX = x1;
    capY = y1 + crossHeight/2;
    capX2 = width - x1;
    diffY = 60;
    diffX = 10;
    redLinex = 145;
    redLinex2 = 350;
    redLiney = 0;
    redlineHeight = height;
    redlineWidth = 5;

    background(200);
    drawConvergingvertical();
    horizontalCross();
    drawYellowlines();
    if (mousePressed) {
        drawRedlines();
    }
}

Обратите внимание, что в функциях обратного вызова мыши не нужно ничего рисовать mousePressed соответственно mouseReleased.

void mousePressed(){
}

void mouseReleased(){
}

Примечание: удалите объявление переменных width и height из вашего кода. Это встроенные переменные, поэтому их вообще не нужно объявлять, тем более что зависимые переменные установлены в draw.

int width = 500;
int height = 500;

0 голосов
/ 31 октября 2019

Метод draw() является циклом. Если вы рисуете свои вещи внутри этого цикла, вы можете обновить их в режиме реального времени. Я немного изменил ваш цикл, поэтому красные линии появляются только тогда, когда левая кнопка мыши нажата:

final int NUM_LINES = 15;
final int LINE_THICK = 20;
final int CONVERGE_VERTICAL_OFFSET = 175;
final int CONVERGE_VERTICAL_OFFSET2 = 100;

int capSize = 20;
int width = 500;
int height = 500;
int x1 = 30;
int crossWidth = width - (30*2);
int y1 = height - 20;
int crossHeight = 20;
int capX = x1;
int capY = y1 + crossHeight/2;
int capX2 = width - x1;
int diffY = 60;
int diffX = 10;
int redLinex = 145;
int redLinex2 = 350;
int redLiney = 0;
int redlineHeight = height;
int redlineWidth = 5;

boolean redLineVisible = false;

void setup(){
  size(500,500);
  //drawConvergingvertical();
  //horizontalCross();
  //drawYellowlines();
}

void draw(){
  background(255);
  drawConvergingvertical();
  horizontalCross();
  drawYellowlines();
  drawRedlines();
}

void mousePressed(){
  //drawRedlines();
  redLineVisible = true;
}

void mouseReleased(){
  //drawConvergingvertical();
  //horizontalCross();
  //drawYellowlines();
  //drawRedlines();
  redLineVisible = false;
}




void horizontalCross(){
  for(int rows = 0; rows < NUM_LINES; rows++){
    //println(rows, capX, capX2); Used this to Debug;
    drawCrossbars();
    y1 = y1 - diffY;
    capY = capY - diffY - 1;
    x1 = x1 + diffX;
    capX = capX + diffX;
    crossWidth = crossWidth - diffX*2;
    capX2 = capX2 - diffX;
    crossHeight = crossHeight - 2;
    capSize = capSize - 2;
  }
}

void drawCrossbars(){
  rect(x1,y1,crossWidth,crossHeight);
  ellipse(capX,capY,capSize,capSize);
  ellipse(capX2,capY,capSize,capSize);
}

void drawConvergingvertical(){
  fill(0);
  stroke(0);
  quad(width/2-CONVERGE_VERTICAL_OFFSET,height,width/2-CONVERGE_VERTICAL_OFFSET2,0,width/2-CONVERGE_VERTICAL_OFFSET2+LINE_THICK,0,width/2-CONVERGE_VERTICAL_OFFSET+LINE_THICK,height);
  quad(width/2+CONVERGE_VERTICAL_OFFSET,height,width/2+CONVERGE_VERTICAL_OFFSET2,0,width/2+CONVERGE_VERTICAL_OFFSET2-LINE_THICK,0,width/2+CONVERGE_VERTICAL_OFFSET-LINE_THICK,height);
}

void drawYellowlines(){
  fill(255,255,0);
  stroke(255,255,0);
  rect(150, height - 100, 200, 10);
  rect(150, 100, 200, 10);
}

void drawRedlines(){
  if (redLineVisible) {
    redLinex = 145;
    redLinex2 = 350;
    redLiney = 0;
    redlineHeight = height;
    redlineWidth = 5;
    fill(255,0,0);
    stroke(255,0,0);
    rect(redLinex,redLiney,redlineWidth,redlineHeight);
    rect(redLinex2,redLiney,redlineWidth,redlineHeight);
  }
}

Веселитесь.

...