Mod:Processingで複数のスケッチ(というかプログラム)を1つのスケッチで実行する
Processingで複数のスケッチ(というかプログラム)を1つのスケッチで実行する方法について。以下のTumblrの記事で紹介されていた。
jtoprocessing.tumblr.comというか、Tumblrの記事は全文表示されるのか。
内容としては、Processingのスケッチで根幹になるPAppletを継承した抽象クラスAppBaseに、セットアップ関数やドロー関数を定義して、それを継承したクラス一つ一つにスケッチを書いていく。そうすると2つ以上のスケッチを切り替えたり読み込んだり出来る。VJとかプロジェクションマッピングみたいなアプリケーションをProcessingで作りたい場合は便利なやり方だと思う。適宜咀嚼して書き換えた。
コード
sketch.pde
ArrayList<AppBase>apps; int selected; void setup() { size(960,540); colorMode(HSB,360,100,100); apps = new ArrayList<AppBase>(); apps.add(new RedCircle(this)); apps.add(new BlueSquare(this)); for(AppBase app:apps){ app.setup(); } selected = 0; } void draw() { apps.get(selected).update(); apps.get(selected).draw(); } void keyPressed(){ if(key == '0'){ selected = 0; } if(key == '1'){ selected = 1; } }
AppBase.pde
// 抽象クラスAppBase // 個別のスケッチを実行するクラスの設計図となる abstract class AppBase { protected PApplet parent; public AppBase(PApplet _parent) { parent = _parent; } public void setup() { //抽象クラスなので何も書かない } public void update() { //抽象クラスなので何も書かない } public void draw() { //抽象クラスなので何も書かない } }
BlueSquare.pde
class BlueSquare extends AppBase { PVector pos; PVector vel; BlueSquare(PApplet _parent) { super(_parent); } @Override void setup() { pos = new PVector(parent.width/2, parent.height/2, 0); vel = PVector.random2D().mult(4); parent.colorMode(HSB, 360, 100, 100); } @Override void update() { pos.add(vel); if(pos.x < 0 || pos.x > width){ vel.x *= -1; } if(pos.y < 0 || pos.y > height){ vel.y *= -1; } } @Override void draw() { parent.noStroke(); parent.background(0, 0, 100); parent.fill(220, 80, 100); parent.rectMode(CENTER); parent.rect(pos.x, pos.y, 50, 50); } }
RedCircle.pde
class RedCircle extends AppBase { PVector pos; PVector vel; PVector acc; RedCircle(PApplet _parent) { super(_parent); } @Override void setup() { pos = new PVector(parent.width/2, parent.height/2, 0); vel = PVector.random2D().mult(4); acc = new PVector(0,0.1); parent.colorMode(HSB, 360, 100, 100); } @Override void update() { vel.add(acc); pos.add(vel); if(pos.x < 0 || pos.x > width){ vel.x *= -1; } if(pos.y < 0 || pos.y > height){ vel.y *= -1; } } @Override void draw() { parent.noStroke(); parent.background(0, 0, 100); parent.fill(0, 80, 100); parent.ellipse(pos.x, pos.y, 50, 50); } }