我的最终目标是创建一个“隧道效应”,因为我将矩形绘制到缓冲区,将缓冲区复制到另一个缓冲区,然后在随后的 draw() 中,将第二个缓冲区复制回第一个缓冲区,只是稍微小一点,然后绘制最重要的是并重复。
我完全被这里发生的事情难住了。
首先,考虑这段代码,它完全按预期工作了 1 次(没有绘制循环):
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();
}
这是一个非常愚蠢的例子,但它证明了这个概念是正确的:我绘制到canvas
,复制到buffer
,复制buffer
回canvas
缩小比例然后输出到主要上下文。
但是看看当我尝试在 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() 中创建的原始矩形每帧都被复制到canvas
. 所以效果是有一个不移动的矩形,然后是第二个矩形,每帧都被绘制和替换。
它变得更奇怪了。观察当我简单地将image()
绘制到主上下文的函数时会发生什么:
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);
}
这不应该改变任何事情,但结果是图像“冻结”了屏幕上的两个矩形。出于某种原因,它似乎只是一遍又一遍地画同样的东西,即使canvas
每次都被重写。
将最后一行更改为阅读
image(buffer, 0, 0);
相反,回到“冻结”缓冲区的先前行为,但每次都在其顶部绘制一个新矩形。
任何人都可以对正在发生的事情有所了解吗?