HYUDORO

勉強したことや日記など

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が行われているためとのこと。

github.com

なので、背景画像を敷くための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。