#04:移動(跳ね返り)
このチャプターでは、描画した図形の移動方法について学習します。
新・Java入門編12: 条件分岐を理解しよう
https://paiza.jp/works/java/new-primer/java-new-primer-12
新・Java入門編8: new演算子を学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-8
新・Java入門編22: クラスについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-22
新・Java入門編24: オブジェクト指向について学習しよう(継承・ポリモーフィズム)
https://paiza.jp/works/java/new-primer/java-new-primer-24
新・Java入門編31: クラスについてもっと学習しよう
ネストされたクラス(Nested Classes)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94006
新・Java入門編31: クラスについてもっと学習しよう
内部クラス(Inner Classes)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94007
新・Java入門編31: クラスについてもっと学習しよう
ローカルクラス(Local Classes)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94008
新・Java入門編31: クラスについてもっと学習しよう
匿名クラス(Anonymous Classes)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94009
新・Java入門編31: クラスについてもっと学習しよう
スタティックネステッドクラス(Static Nested Classes)
https://paiza.jp/works/java/new-primer/java-new-primer-31/94010
Circle c1;
int w = 700;
int h = 700;
float extent = 50;
void settings() {
  size(w, h);
}
void setup() {
  colorMode(HSB, 360, 100, 100);
  background(0, 0, 0);
  c1 = new Circle(-extent / 2, h / 2, extent);
}
void draw() {
  background(0, 0, 100);
  c1.moveX();
  if (c1.isOutsideX(w)) {
    c1 = new Circle(-extent / 2, h / 2, extent);
  }
  c1.draw();
}class Circle {
  float x;
  float y;
  float extent;  
  float h;  
  
  Circle(float x, float y, float extent) {
    this.x = x;
    this.y = y;
    this.extent = extent;
    this.h = random(360);
  }
  
  void moveX() {
    this.x += 1;
  }
  
  void moveY() {
    this.y += 1;
  }
  
  boolean isOutsideX(float w) {
    return this.x >= w + (this.extent / 2);
  }
  boolean isOutsideY(float h) {
    return this.y >= h + (this.extent / 2);
  }
  
  void draw() {
    noStroke();
    fill(this.h, 100, 100, 100);
    circle(this.x, this.y, this.extent);
  }
}
Circle c1;
int w = 700;
int h = 700;
float extent = 50;
void settings() {
  size(w, h);
}
void setup() {
  colorMode(HSB, 360, 100, 100);
  background(0, 0, 100);
  c1 = new Circle(extent / 2, h / 2, extent);
}
void draw() {
  background(0, 0,100);
  c1.moveX();
  c1.moveY();
  if (c1.checkTouchWallX(w)) {
    c1.reverseX();
  }
  if (c1.checkTouchWallY(h)) {
    c1.reverseY();
  }
  c1.draw();
}class Circle {
  float x;
  float y;
  float extent;  
  float h;
  float deltaX = 1;
  float deltaY = 1;
  
  Circle(float x, float y, float extent) {
    this.x = x;
    this.y = y;
    this.extent = extent;
    this.h = random(360);
  }
  
  void moveX() {
    this.x += this.deltaX;
  }
  
  void moveY() {
    this.y += this.deltaY;
  }
  
  boolean isOutsideX(float w) {
    return this.x >= w + (this.extent / 2);
  }
  boolean isOutsideY(float h) {
    return this.y >= h + (this.extent / 2);
  }
  
  boolean checkTouchWallX(float w) {
    return this.x >= w - (this.extent / 2) || this.x <= this.extent / 2;
  }
  
  boolean checkTouchWallY(float h) {
    return this.y >= h - (this.extent / 2) || this.y <= this.extent / 2;
  }
  
  void reverseX() {
    this.deltaX = -this.deltaX; 
  }
  void reverseY() {
    this.deltaY = -this.deltaY; 
  }
  void draw() {
    noStroke();
    fill(this.h, 100, 100, 100);
    circle(this.x, this.y, this.extent);
  }
}