フルーツカッター

「クラスを使ってオブジェクトを作成して、リストで管理する」、これをテーマとして生徒さんが楽しんでいただけるようなサンプルを作成しています。今回は少し長くなりましたがゲームを作ってみました。飛んでくるフルーツをマウスで切るだけです。ときどき爆弾が飛んできますが、これを切るとスコアが0に戻ります。

Java

class Fruit {
  boolean bomb = false, cut = false;
  PImage img;
  PVector pos, speed;
  float theta, omega;
  int point;

  Fruit(float x, float y, float dx, float dy, int index) {
    pos = new PVector(x, y);
    speed = new PVector(dx, dy);
    img = images[index];
    bomb = index == 0;
    point = index * 10;
    omega = random(-5, 5);
  }

  void tick() {
    speed.y += 0.1;
    pos.add(speed);
    theta += omega;
    pushMatrix();
    translate(pos.x, pos.y);
    rotate(radians(theta));
    image(img, 0, 0);
    popMatrix();
  } 

  void knife(float x, float y) {
    if (cut == false && dist(pos.x, pos.y, x, y) < 50) {
      cut = true;
      score += point;
      if (bomb) {
        background(255, 255, 0);
        score = 0;
      }
    }
  }

  boolean invalid() {
    return pos.y > 600 || cut;
  }
}

ArrayList<Fruit> fruits = new ArrayList<Fruit>();
PImage[] images = new PImage[7];
int score;
int interval = 120;
int elapsed = 0;

void setup() {
  size(600, 600);
  for (int i = 0; i < 7; i++) {
    images[i] = loadImage("fruit"+i+".png");
  }
  strokeWeight(5);
  textSize(40);
  textAlign(CENTER);
}

void draw() {
  fill(0, 40);
  noStroke();
  rect(0, 0, width, height);

  fill(255, 255, 0);
  text("Score:"+score, 300, 50);

  elapsed += 1;
  if (elapsed > 2000) {
    text("TIME UP", 300, 300);
    text("Click To Start", 300, 500);
    return;
  }

  if (elapsed % interval == 0) {
    int num = elapsed / 500 + 1;
    for (int i = 0; i < num; i++) {
      float x = random(100, 500), y = 600;
      float dx = random(-3, 3), dy = random(-13, -8);
      int index = (int)random(7);
      fruits.add(new Fruit(x, y, dx, dy, index));
    }

    interval = max(10, interval - 1);
  }
  
  imageMode(CENTER);
  for (Fruit f : fruits) {
    f.tick();
  }

  for (int i = fruits.size() - 1; i >= 0; i--) {
    Fruit f = fruits.get(i);
    if (f.invalid()) {
      fruits.remove(i);
    }
  }

  stroke(0, 255, 0);
  line(0, 590, ((2000-elapsed)/2000.0)*width, 590);
}

void mouseDragged() {
  stroke(255);
  line(pmouseX, pmouseY, mouseX, mouseY);
  for (Fruit f : fruits) {
    f.knife(mouseX, mouseY);
  }
}

void mousePressed() {
  if (elapsed > 2000) {
    score = 0;
    elapsed = 0;
    interval = 120;
    fruits.clear();
  }
}