当前位置: 首页 > 知识库问答 >
问题:

PGraphics似乎在绘制到主上下文时被清除或冻结

耿学义
2023-03-14

我的最终目标是创建一个“隧道效果”,因为我将一个rect绘制到一个缓冲区,将该缓冲区复制到另一个缓冲区,在随后的draw()中,将第二个缓冲区复制回第一个缓冲区,只是稍微小一点,然后在该缓冲区上绘制并重复。

我完全被这里发生的事情难倒了。

PGraphics canvas;
PGraphics buffer;

void setup(){
  size(500, 500);
  canvas = createGraphics(width, height);
  buffer = createGraphics(canvas.width, canvas.height);

  canvas.beginDraw();
  canvas.background(255);
  canvas.noFill();
  canvas.stroke(0);
  canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
  canvas.endDraw();

  buffer.beginDraw();
  buffer.image(canvas, 0, 0);
  buffer.endDraw();

  canvas.beginDraw();
  canvas.image(buffer, 100, 100, width-200, height-200);
  canvas.endDraw();

  image(canvas, 0, 0);

  noLoop();
}

这是一个非常愚蠢的示例,但它证明了这个概念是正确的:我绘制到画布,复制到缓冲区,将缓冲区复制回画布,然后输出到主上下文。

但是看看当我在draw()循环中尝试这样做时会发生什么:

PGraphics canvas;
PGraphics buffer;

void setup(){
  size(500, 500);
  canvas = createGraphics(width, height);
  buffer = createGraphics(canvas.width, canvas.height);

  canvas.beginDraw();
  canvas.background(255);
  canvas.noFill();
  canvas.stroke(0);
  canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
  canvas.endDraw();

  buffer.beginDraw();
  buffer.image(canvas, 0, 0);
  buffer.endDraw();
}

void draw(){
  canvas.beginDraw();
  canvas.image(buffer, 0, 0);
  canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
  canvas.endDraw();

  image(canvas, 0, 0);

  buffer.beginDraw();
  buffer.image(canvas, 0, 0);
  buffer.endDraw();
}

在这里,最终发生的是,在setup()中创建的原始rect每帧都被复制到canvas。因此,效果是有一个不移动的rect,然后第二个rect被绘制和替换每一帧。

PGraphics canvas;
PGraphics buffer;

void setup(){
  size(500, 500);
  canvas = createGraphics(width, height);
  buffer = createGraphics(canvas.width, canvas.height);

  canvas.beginDraw();
  canvas.background(255);
  canvas.noFill();
  canvas.stroke(0);
  canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
  canvas.endDraw();

  buffer.beginDraw();
  buffer.image(canvas, 0, 0);
  buffer.endDraw();
}

void draw(){
  canvas.beginDraw();
  canvas.image(buffer, 0, 0);
  canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
  canvas.endDraw();

  buffer.beginDraw();
  buffer.image(canvas, 0, 0);
  buffer.endDraw();

  image(canvas, 0, 0);
}
image(buffer, 0, 0);

相反,它回到了以前的“冻结”缓冲区的行为,但每次都在它上面画一个新的rect。

有人能解释一下正在发生的事情吗?

共有1个答案

公羊英达
2023-03-14

具体考虑一下每个pgraphics图像中的内容。

每个pgraphics都是一个带有白色背景和黑色矩形的500x500图像。

然后你把一个图像画在另一个图像上。它们仍然都是白色的图像,上面有一个黑色的矩形。重要的是要注意的是,因为他们都有白色背景,你将不能看到“旧”的图像“通过”新的。所以你只是来回画同一个矩形。

我还将注意到,通过对主画布进行同样的操作,您可能只需要将单个缓冲区图像越画越小,甚至根本不需要缓冲区图像,就可以实现这种效果。

 类似资料:
  • 我的最后一个想法,我还没有尝试实现,是将鼠标触摸过的像素附加到一个列表中,并从这个列表中绘制每一帧。但对我来说,这似乎相当复杂,因为它可能会导致超长的数组需要在原始图像的顶部进行处理。所以,我希望还有别的办法! 编辑:我的目标是创建一个涂抹画笔,因此画笔是一种复制区域从一个部分的图像到其他部分。

  • 问题内容: 我有以下代码在NSImage上绘制文本。但是,当我将其保存到磁盘时,生成的图像将被调整为较小的尺寸。 我做错了什么?请指教 问题答案: 这是另一种使用临时方法绘制图像和文本并将结果缓存到新图像中的方法(代码为Swift 4)。您无需处理像素的好处 要使用它,初始化一个视图 并获得新的形象 注意: 根本不使用段落样式,但是如果要创建可变的段落样式,只需编写

  • JNA还加载正确的库。 这里有人知道为什么不起作用吗?是因为我使用的是带有清单的jar应用程序文件吗? 有人有类似的问题吗?

  • 好吧,这是一个奇怪的,我甚至不认为是可能的。 所以,自从我使用Nexus5X以来,当我卸载应用程序时,SharedPreferences就不会被删除。 我通过Android Studio安装了这个应用程序并进行了测试。然后我卸载应用程序。然后我通过Android Studio重新发布了这个应用程序,所有的SharedPreferences值仍然存在。 知道是什么引起的吗?

  • 问题内容: 我不确定是否已经询问过此问题,但是我有多个输入框,其中包含默认文本。我不是要设置默认的文本,而是要在单击输入框时删除它。我希望能够在单击输入框后立即删除默认文本,因此用户不必这样做。我想知道是否有人可以分享一个有关如何完成此操作的快速示例,以便我可以实施。 到目前为止,我已经知道了,但是只删除了最后一个输入框文本。 问题答案: 假设您已整理好默认文本,则想在某个地方创建事件绑定,并使用