FruitsCutter

オブジェクトをリストで管理 (フルーツカッター)

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

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();
  }
}

Fruitというクラスで個々の果物や爆弾を管理しています。このFruitオブジェクトには以下のようなプロパティがあります。

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

posが場所、speedが速度、thetaが角度、omegaが回転速度です。Fruitのコンストラクタで初期化し、tickメソッドが呼ばれるたびに値を更新しています。knifeメソッドは、マウスの動きによってフルーツが切られたか判定しています。dist関数を使って距離を求めることで判定しています。

Categories: Processing, Programming