私の最終的な目標は、四角形をバッファーに描画し、そのバッファーを別のバッファーにコピーし、その後の draw() で 2 番目のバッファーを最初のバッファーにコピーし、わずかに小さくしてから、「トンネル効果」を作成することです。その上で繰り返します。
ここで何が起こっているのか、私は完全に困惑しています。
まず、次のコードを考えてみましょう。これは 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() で作成された元の rect がフレームごとに にコピーされることになりcanvas
ます。その結果、移動しない rect が存在し、次に 2 つ目の rect がフレームごとに描画されて置き換えられます。
それは奇妙になります。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);
}
これで何かが変わるわけではありませんが、その結果、画像が「フリーズ」して画面上に 2 つの四角形が表示されます。canvas
毎回書き直されているのに、なぜか同じものを何度も描いているように見える。
その最後の行を読み取るように変更する
image(buffer, 0, 0);
代わりに、バッファを「フリーズ」する以前の動作に戻りますが、毎回その上に新しい四角形を描画します。
何が起こっているのか、誰かが光を当てることができますか?