日常の進捗

主に自分のための,行為とその習慣化の記録

Mod:Coding Challenge #7: Solar System in Processing - Part 1 (2D)

そんなに書き換えなかった。今回2Dで次回が3Dなのでそっちを頑張る感じ。

Planet sun;

// setup関数 : 初回1度だけ実行される
void setup() {
  size(960, 540); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100, 100); // HSBでの色指定にする
  sun = new Planet(30, 0, 0);
  sun.spawnMoons(5, 1);
  background(0, 0, 0);
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  fill(0, 0, 0, 30);
  rect(0, 0, width, height);
  translate(width/2, height/2);
  sun.draw();
  sun.orbit();
}

class Planet {
  float radius;
  float angle;
  float distance;
  Planet[] planets;
  float orbitSpeed;
  Planet(float r, float _d, float o) {
    radius = r;
    angle = random(TWO_PI);
    distance  = _d;
    orbitSpeed = o;
  }

  void spawnMoons(int total, int level) {
    planets = new Planet[total];
    for (int i = 0; i < planets.length; i++) {
      float r = radius/(level * 1.2);
      float d = random(75, 500)/level;
      float o = random(0.001,0.01);
      if(random(1) < 0.5) o *= -1;
      planets[i] = new Planet(r, d, o);
      if (level < 3) {
        int num = int(random(4));
        planets[i].spawnMoons(5, level+1);
      }
    }
  }

  void orbit() {
    angle = angle + orbitSpeed;
    if (planets != null) {
      for (int i = 0; i < planets.length; i++) {
        planets[i].orbit();
      }
    }
  }

  void draw() {
    pushMatrix();
    rotate(angle);
    translate(distance, 0);
    fill(0, 0, 100, 50);
    noStroke();
    ellipse(0, 0, radius*2, radius*2);
    if (planets != null) {
      for (int i = 0; i < planets.length; i++) {
        planets[i].draw();
      }
    }
    popMatrix();
  }
}

リファレンス