日常の進捗

主に自分のための,行為とその習慣化の記録

Mod:Processingで複数のスケッチ(というかプログラム)を1つのスケッチで実行する

Processingで複数のスケッチ(というかプログラム)を1つのスケッチで実行する方法について。以下のTumblrの記事で紹介されていた。

http://jtoprocessing.tumblr.com/post/38867546415/a-way-to-switch-among-multiple-processing-sketches
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);
  }
}