お化け屋敷

クラスとリストの練習サンプルです。
ホタル(別のサンプル)とよく似ています。画像を変えただけでずいぶん印象が変わります。

一定周期でお化けが出現します。パーリンノイズを使ってゆらゆら動く様子を表現しています。
ゆっくり、消えたり現れたりしますが、その様子を表現するためにサイン関数を使用しました。

PImage ghost, back, hammer;
int hcount = 0;

class Ghost {
  PVector pos = new PVector(random(600), random(600));
  float nx = random(100), ny = random(100);
  float tick = 0, step = 0.01;
  boolean invalid = false;

  void paint() {
    pos.x += noise(nx) * 10 - 5;
    pos.y += noise(ny) * 10 - 5;
    nx = nx + step;
    ny = ny + step;
    tick += 1;
    tint(255, 255*sin(radians(tick)));
    image(ghost, pos.x, pos.y);
  }

  void hit(float x, float y){
    if (pos.x < x && x < pos.x + 100 && pos.y < y & y < pos.y + 100){
      invalid = true;
    }
  }
  
  boolean isInvalid() {
    return pos.x < -100 || pos.x > 600 || pos.y < -100 || pos.y > 600 || invalid;
  }
}

ArrayList<Ghost> ghosts = new ArrayList<Ghost>();

void setup() {
  back = loadImage("ghost_building.png");
  ghost = loadImage("ghost.png");
  hammer = loadImage("hammer.png");
  size(600, 600);
}

void draw() {
  background(0);
  tint(255, 255);
  image(back, 0, 0);
  if (frameCount % 50 == 0) {
    ghosts.add(new Ghost());
  }
  for (Ghost g : ghosts) {
    g.paint();
  }

  for (int i = ghosts.size() - 1; i >= 0; i--) {
    Ghost g = ghosts.get(i);
    if (g.isInvalid()) {
      ghosts.remove(i);
    }
  }
  
  if (hcount > 0) {
    hcount--;
    tint(255, 255);
    image(hammer, mouseX-50, mouseY-50);
  }
}

void mousePressed(){
  hcount = 10;
  for (Ghost g : ghosts) {
    g.hit(mouseX, mouseY);
  }  
}