はじめに
この記事では、Processing3.3.5(7/2現在最新)の settings() や setup() 、 draw() がどうやって動いているのかの説明していきます。IDEに関する説明ではありません。
間違いやさらなる面白い情報があるという方は是非、コメントにてご指摘ください!
どうやって解明するのか
https://github.com/processing/processing
This is the official source code for the Processing Development Environment (PDE), the “core” and the libraries that are included with the download.
ということでProcessingの公式のソースコードを読んでいきます。
core/src/processingの中にProcessingがどうやって動いているのかが詳しく書かれています。
settings() と setup() 、 draw() の定義
これら3つの関数は全て PApplet.java の中で定義されています。1つずつ見ていきましょう。
settings()
public void settings() {
// is this necessary? (doesn't appear to be, so removing)
//size(DEFAULT_WIDTH, DEFAULT_HEIGHT, JAVA2D);
}
setup()
public void setup() {
}
draw()
public void draw() {
// if no draw method, then shut things down
//System.out.println("no draw method, goodbye");
finished = true;
}
ほとんど何も書いてない...
Processingでみなさんが書いているコードは実は PApplet を継承したclassです。以下のコードを実行すると、ちゃんと true が返ってきます。
println(this instanceof PApplet);
Processingでは PApplet の settings() や setup() 、 draw() をオーバーライドすることを前提として書かれています。コードの前に @Override と書いてもエラーは出ません。
各関数は何処で使われているの?
settings() は handleSettings() という関数で呼び出されています。
また setup() と draw() は handleDraw() という関数で呼び出されています。
両方とも、 PApplet の中に存在します。
handleSettings()
この後 PApplet 内で、 runSketch() ⇒ main() という順番に呼び出されていきます。
余談ですが、この関数内では insideSettings というboolean型の変数が使われています。Processingの smooth() と noSmooth() は insideSettings という変数がtrueのときだけのみ動きます。trueの状態で処理を行えるのは settings() の中だけなので注意しましょう。実際に 困っている人 もいました。
handleDraw()
frameCount == 0 のときは setup() 、それ以外のときは draw() が呼び出されるようになっています。これまた小ネタですが、 frameCount はpublicな変数なので、 自由に数値をいじれます。 frameCount = -1 と draw() 内で行うと setup() が呼び出されます。使う機会はないでしょうが、Processingの脆弱性の一つでしょう。
AnimationThread
PSurfaceNone というクラスの中に AnimationThread というThreadが定義されています。 handleDraw() はその中の callDraw() で呼ばれ、さらに run() の中でwhile文によって終了条件を満たすまでループされ続けます。
まとめ
以上、いつも私達がProcessingで書いていた settings() や setup() 、 draw() がどのように動いているかの解説をさせていただきました。この記事を見て納得して頂けたら幸いです。
最後にまたまた小ネタ
handleDraw() はpublicなので、オーバーライドすることができます。以下のコードを他人のコードに入れるだけで setup() と draw() は呼び出されなくなります。
void handleDraw() {
}
これもまたProcessingの脆弱性と言えるでしょう。大丈夫なのかProcessing...