processing ( papplet ) を外から使う時
に、便利なメソッドが用意されていて
appletのサイズを外から取得する時
PApplet app;
という感じで app.width とか app.height に直にアクセスしてもタイミングによって取れない。setupメソッドが呼ばれた後じゃないといけない。
で、processingにはdrawメソッドが呼ばれる前、呼ばれた後、paintされた後とかをフック出来る
class Test { private PApplet app; public Test(PApplet app) { this.app = app; app.registerPre(this); } public void pre() { app.unregisterPre(this); Dimension size = new Dimension(app.width, app.height); } }
こんな感じでdrawメソッドが呼ばれる前のpreって所でサイズは取れてるのでこういう感じにする。
書き終わったpixelsに外からアクセスする時
は同じように
class Test { private PApplet app; public Test(PApplet app) { this.app = app; app.registerPost(this); } public void post() { //app.pixels } }
のようにpostってのをフックする。でもここで重い処理をすると引きづられて描画が重くなるので
class Test { private PApplet app; private ArrayBlockingQueue<int[]> queue; public Test(PApplet app) { this.app = app; app.registerPost(this); new Thread(worker).start(); } public void post() { queue.put(Arrays.copyOf(app.pixels, app.pixels.length)); } private Runnable worker = new Runnable() { @Override public void run() { while (true) { int[] argb = queue.take(); } } }; }
こんな感じで別スレッドで処理した方がいい気がした。まぁこれは並列処理しないでいい時の例。
ちなみにsizeのフックの所はメソッドはあるけど、処理自体がコメントアウトされてる。