Java 用于循环绘制阵列中的图形[处理]
我正在尝试使用处理构建一个绘图程序。我目前一直在使用Java 用于循环绘制阵列中的图形[处理],java,arraylist,processing,pgraphics,Java,Arraylist,Processing,Pgraphics,我正在尝试使用处理构建一个绘图程序。我目前一直在使用pgraphics 当用户绘制矩形时,它显示正在绘制的形状。当用户释放鼠标时,它会创建最终形状的PGraphic。然后我想让用户在上面画。我的问题是: 在绘制矩形时,我必须重置画布的背景,否则,它会显示一系列矩形。结果是,当用户绘制一个新矩形时,旧矩形会消失,并在鼠标被释放后返回 一些想法: 我还想添加一些功能,用户可以在以前绘制的矩形上进行选择,并更改其颜色、笔划、发送到后面、带到前面等 为了实现这一点,我将所有绘制的矩形(PGraphics
pgraphics
当用户绘制矩形时,它显示正在绘制的形状。当用户释放鼠标时,它会创建最终形状的PGraphic
。然后我想让用户在上面画。我的问题是:
在绘制矩形时,我必须重置画布的背景,否则,它会显示一系列矩形。结果是,当用户绘制一个新矩形时,旧矩形会消失,并在鼠标被释放后返回
一些想法:
我还想添加一些功能,用户可以在以前绘制的矩形上进行选择,并更改其颜色、笔划、发送到后面、带到前面等
为了实现这一点,我将所有绘制的矩形(PGraphics)存储到ArrayList
中,该列表将通过for循环绘制。这将允许我通过在ArrayList
上下移动PGraphics
元素来调整行为
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);
}
今后,请在发帖前尽量将问题缩小到a。例如,您可以将其硬编码为在用户拖动时绘制矩形,而不是包含每个形状的所有代码 但是你的问题是由于画到屏幕上而从不清除它造成的。你需要一个接一个的接近这些碎片 第1步:您能否创建一个草图,在拖动时只显示一个矩形,但当您放开鼠标时,该矩形是否消失了?从一个只做这一件事的基本草图开始,在进入下一步之前,让它完美地工作 第2步:您能将形状绘制到屏幕外缓冲区吗?看起来您已经在当前代码中尝试过这一点,但请注意,您从来没有在缓冲区中实际绘制过任何形状,也从来没有在屏幕上实际绘制过缓冲区。同样,从一个基本的草图开始。甚至不用担心用户输入或任何事情,只需将硬编码的矩形绘制到屏幕外缓冲区,然后将屏幕外缓冲区绘制到屏幕上即可 第3步:在绘制矩形时,能否将这两种方法结合起来显示矩形,然后在用户释放时将其绘制到屏幕外缓冲区 第4步:只有当矩形工作正常时,才能转到其他形状
编程就是这样工作的:你必须把你的问题分解成像这样的小步骤,然后你必须孤立地处理每一步。如果你被卡住了,你可以带着一个MCVE回来,只显示其中的一个步骤,我们将从那里开始。祝你好运。除了凯文的答案之外:看起来你确实在使用另一个
PGraphics
缓冲区来绘制,但是整个草图可能更简单
除非需要撤消/重做模式(需要记住图形命令及其顺序),否则可以使用稍微简单一点的方法
你可以找到一个非常相似的展览。您只需添加铅笔和线条模式。抱歉@kevin!我应该缩短我的代码和问题-我只是这么痛苦后,工作了几个小时,一事无成哈哈-我已经成功地实现了步骤1-2,除了我无法显示矩形时,绘制它。我可以得到矩形显示在屏幕外缓冲区一旦鼠标已经释放。顺便说一下,谢谢!
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);
}
}