クラスとリストの練習サンプルです。ホタル(別のサンプル)とよく似ています。画像を変えただけでずいぶん印象が変わります。一定周期でお化けが出現します。パーリンノイズを使ってゆらゆら動く様子を表現しています。ゆっくり、消えたり現れたりしますが、その様子を表現するためにサイン関数を使用しました。
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);
}
}