0

我正在尝试使用处理构建绘图程序。我目前坚持使用PGrapchics.

当用户绘制一个矩形时,它会显示正在绘制的形状。当用户释放他们的鼠标时,它会创建一个PGraphic最终的形状。然后,我希望用户在此基础上进行绘制。这是我的问题:

绘制矩形时,我必须重置画布的背景,否则,它会显示矩形的轨迹。结果是,当用户绘制一个新的矩形时,旧的矩形消失并在鼠标被释放后又回来

一些想法:我还想添加用户可以在先前绘制的矩形上选择并更改其颜色、笔触、发送到后面、带到前面等的功能。

为了实现这一点,我将所有绘制的矩形(PGraphics)存储到一个ArrayList将通过 for 循环绘制的矩形中。PGraphics这将允许我通过上下移动元素来调整行为ArrayList

PS:与其创建我自己的类,Shape不如使用 PShape 更好?

int startX;
int startY;
int endX;
int endY;
boolean drawing;
int strokeW = 3;
Shape shape;

PGraphics shapeLayer; 
ArrayList<PGraphics> layersList = new ArrayList();

void setup() {
  size(500, 500);
  cursor(CROSS);
  background(255);
  smooth();
}

void draw() {
  strokeWeight(strokeW);
  if (key >= '0' && key <= '9') {
    strokeW = key - '0';
  }
  for(int i = 0; i < layersList.size(); i++) {
    image(layersList.get(i), 0, 0);
  }
  if (drawing) {
    shape.createRectangle();
  }
}


void mousePressed() {
  startX = mouseX;
  startY = mouseY;

  shapeLayer = createGraphics(width, height);
  shapeLayer.beginDraw();
}  

void mouseDragged() {
  drawing = true;
  endX = constrain(mouseX, 0, 500);
  endY = constrain(mouseY, 0, 500); 

  shape = new Shape(startX, startY, endX, endY);
  shapeLayer.clear();
}

void mouseReleased() {
  drawing = false;
  shapeLayer.endDraw();
  layersList.add(shapeLayer);
}  

这是Shape课程:

class Shape {
  int startX;
  int startY;
  int endX;
  int endY;

  Shape(int x1, int y1, int x2, int y2) {
    startX = x1;
    startY = y1;
    endX = x2;
    endY = y2;
  }    

  void createRectangle() {
    background(255, 0);
    shapeLayer.strokeWeight(strokeW);
    shapeLayer.rectMode(CORNERS);
    shapeLayer.rect(startX, startY, endX, endY);  
    rectMode(CORNERS);
    rect(startX, startY, endX, endY);

  }

}  
4

2 回答 2

0

除了凯文的回答:看起来你正在使用另一个PGraphics缓冲区来绘制,但整个草图可能更简单。

除非您需要撤消/重做模式,在这种模式下需要记住绘图命令及其顺序,否则您可以使用稍微简单一些的东西。

您可以找到带有注释代码的详细答案,其中显示了非常相似的内容。您只需要添加铅笔和线条模式。

于 2017-03-17T22:27:19.767 回答
0

将来,请在发布之前尝试将您的问题缩小到MCVE。例如,您可以硬编码它以在用户拖动时绘制一个矩形,而不是包含每个形状的所有代码。

但是您的问题是由绘制到屏幕上并且从不清除它引起的。你需要把你的问题分解成更小的部分,然后一次处理这些部分。

第 1 步:您能否创建一个草图,在您拖动时只显示一个矩形,但当您放开鼠标时矩形会消失吗?从只做这件事的基本草图开始,并在继续下一步之前让它完美地工作。

第 2 步:您可以将形状绘制到屏幕外缓冲区吗?看起来您已经在当前代码中尝试过此操作,但请注意,您实际上从未将任何形状绘制到缓冲区,也从未实际将缓冲区绘制到屏幕上。再次,从一个基本的草图开始。甚至不必担心用户输入或其他任何事情,只需将硬编码的矩形绘制到屏幕外缓冲区,然后将该屏幕外缓冲区绘制到屏幕上。

第 3 步:您能否在绘制矩形时将这两者结合起来显示矩形,然后在用户松开时将其绘制到屏幕外缓冲区?

第 4 步:只有当你的矩形完美工作时,然后才能移动到其他形状。

这就是编程的工作原理:您必须像这样将问题分解成小步骤,然后您必须孤立地处理每个步骤。如果您遇到困难,您可以返回一个仅显示其中一个步骤的 MCVE,我们将从那里开始。祝你好运。

于 2017-03-15T01:02:03.873 回答