雨の風景 - Processingでのシンプルなクラス

雨の風景

クラスに慣れるのに苦戦している方は少なくありません。たくさんの例に触れることが近道だと思っています。簡単なサンプルを作成してみました。雨粒を傘でよけるだけのサンプルです。
rain
クラスは設計図で、その設計図をもとに作られたものがオブジェクト(もしくはインスタンス)となります。今回の設計図(Dropクラス)はとてもシンプルです。

  • pos = 雨粒の座標
  • speed = 雨粒の速度(1フレームに移動する量)

setup関数でDropクラスの設計図として100個のオブジェクトを作成しています。

draw関数では背景と傘を描画しつつ100個の雨粒を移動・描画しています。地面につくか、傘(マウスの座標)からの距離が100未満になったときに、画面上部に移動するという処理を行っています。

for文は for(int i = 0 ; i < 100 ; i++) { ...のように記述しても構いません。今回は for (Drop d : drops){ ...という記法を使ってみました。


PImage back, umbrella;

class Drop {
  PVector pos, speed;
}

Drop[] drops = new Drop[100];

void setup() {
  size(800, 450);
  back = loadImage("raining.jpg");  
  umbrella = loadImage("umbrella.png");  
  for (int i = 0; i < 100; i++) {
    drops[i] = new Drop();
    drops[i].pos = new PVector(random(width), random(height));
    drops[i].speed = new PVector(2, 4);
  }
  noStroke();
}

void draw() {
  imageMode(CORNER);
  image(back, 0, 0);

  imageMode(CENTER);
  image(umbrella, mouseX, mouseY);

  fill(200, 200, 255);
  for (Drop d : drops) {
    ellipse(d.pos.x, d.pos.y, 10, 10);
    d.pos.add(d.speed);
    float p = dist(mouseX, mouseY, d.pos.x, d.pos.y);
    if (d.pos.y > height || p < 100) {
      d.pos = new PVector(random(width), 0);
    }
  }
}