Processing3でsize()のパラメータに変数を使う
2015年からの話になるが、備忘録として書いておく。
Processing3系になってからsize()のパラメータに変数を使えなくなっている。例えばdata内にある画像と同じウィンドウサイズにしたいときなど、変数が使えないと困る。もしパラメータに変数を入れようとするとCould not find sketch size ...
といったエラー文が表示される。
これを回避するためには、surface.setResizable()
をtrue
にする必要がある。下記に画像の縦横幅を変数としてsize()にパラメータを渡す処理の例を記載する。
PImage img; void setup() { img = loadImage("img.jpg"); surface.setResizable(true); surface.setSize(img.width, img.height); } void draw() { ... }
PSurfaceについてはこちらを参照。
追記
surface.setSize()
をして、さらに背景画像をsetup()
の中で描画しようと思っても、画像が表示されないことがある。
理由としては、setupの処理が終わった後にsurface.setSizeが行われているためとのこと。
なので、背景画像を敷くためのimage()
メソッドを実行するのはdraw()
の中で行わなければならない。ただし、drawは常にループしているので、(1)drawのループをnoLoop()
で止めるか(2)1フレーム目のみ描画させるか、という方法で描画処理を制御しなければいけない。
(1)の場合
PImage img; void setup() { img = loadImage("img.jpg"); surface.setResizable(true); surface.setSize(img.width, img.height); } void draw() { image(img, 0, 0); noLoop(); }
(2)の場合
PImage img; void setup() { img = loadImage("img.jpg"); surface.setResizable(true); surface.setSize(img.width, img.height); } void draw() { if (frameCount == 1) { image(img, 0, 0); } ... }
noLoop()
で描画の更新を止められるのが困るのであれば、(2)の方法で1フレーム以降の処理を記述していけばOK。