Help us understand the problem. What is going on with this article?

P2D rendererを使用するとdraw()外でsaveFrameできない問題

MacBookProを新調しグラボの乗った筐体でゴリゴリProcessingを書いていたところ、size()のオプションのP2D rendererを使用した際、keyPressed()の中でsaveFrame()出来なくてグエエエエってなったのでちょっと調べた

結果

draw()内で呼び出せばどうにかなった

うまくいかなかったコード

void setup() {
  size(800, 800, P2D);
  // ~
  noLoop();
}

void draw() {
  // 何かしらの描画したいもの
}

void keyPressed() {
  redraw();
  if (key == 's') {
    saveFrame("frames/frame-####.png");
  }
}

VSCode使うのやめてPDEで実行してみて下のコンソールを見てみるとこんなエラーが出てた

You are trying to draw outside OpenGL's animation thread.
Place all drawing commands in the draw() function, or inside
your own functions as long as they are called from draw(),
but not in event handling functions such as keyPressed()
or mousePressed().

とにかくdraw()内でやらないと許しませんという雰囲気。

エラーをちまちま調べてるとこんな記事を見つけたので試すもうまく動かない、よくあるやつ。

Processingのissueをザーッと眺めてると似たような感じのエラーに遭遇してる人発見、光が差す
-> noLoop()のリファレンス見るといいよってあったので見る

いい感じに書いているのがあったのでそれをちょっと改変

こんな感じ

boolean keyMode = false;

void setup() {
  size(800, 800, P2D);
  // ~
  noLoop();
}

void draw() {
  // 何かしらの描画したいもの
  }
  if (keyMode) {
    saveFrame("frames/frame-####.png");
  }
}

void keyPressed() {
  redraw();
  if (key == 's') {
    keyMode = true;
  }
}

うまくいった、うれしい。

まとめる

結論

公式リファレンスとGitHubに生えてるissueは神。
これで気持ちよくいろいろ作ってぽんぽんフレームを保存できるのでやったね

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした