首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于数组中的循环绘制PGraphics [处理]

用于数组中的循环绘制PGraphics [处理]
EN

Stack Overflow用户
提问于 2017-03-14 20:57:49
回答 2查看 430关注 0票数 0

我试着用处理来构建一个绘图程序。目前,我一直在使用PGrapchics

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

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

一些想法:我也想添加一些功能,用户可以在以前绘制的矩形上进行选择,并改变它的颜色、笔画、发送到后面、带到前面等。

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

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

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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);

  }

}  
EN

回答 2

Stack Overflow用户

发布于 2017-03-15 01:02:03

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

但是,您的问题是由于绘制到屏幕上,而不是清除它。您需要把你的问题分解成更小的部分,然后逐个接近这些部分。

步骤1:可以创建一个草图,在拖动时只显示一个矩形,但当您松开鼠标时,矩形会消失吗?从一个基本的草图开始,只做这一件事,在你进入下一个步骤之前,让它完美地工作。

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

步骤3:当您正在绘制矩形时,可以将这两个矩形组合起来显示它,然后在用户放手时将其绘制到屏幕外缓冲区中吗?

步骤4:只有当矩形完美地工作时,才会移动到其他形状。

这就是编程的工作原理:你必须把你的问题分解成这样的小步骤,然后你必须孤立地对待每一个步骤。如果你被卡住了,你可以带着一个MCVE回来,只显示其中一个步骤,我们就从那里开始。祝好运。

票数 0
EN

Stack Overflow用户

发布于 2017-03-17 22:27:19

除了Kevin的回答:看起来您确实使用了另一个PGraphics缓冲区来绘制,但是整个草图可能更简单。

除非您需要撤消/重做模式(需要记住绘图命令及其顺序),否则您可以使用稍微简单一些的方法。

您可以找到一个显示类似内容的注释代码的详细回答。您只需添加铅笔和行模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42796405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档