動的配列

      動的配列 はコメントを受け付けていません

通常、配列の要素数はnew int[10]などのように始めに決めることになっています。しかし、実はこのやり方だと、最初にどのぐらい必要かわからない時には不便です。
例えば、ユーザのインタラクション次第でどんどん増やせると便利そうです。
実はみなさんがすでに学習した配列でも、プログラムの実行中に増やすことが可能です。1次元配列のサンプルを書き換えてみましょう。
すでに作成した拡大縮小する円をマウスクリックで増やし、キーボードを押して削除していくサンプルです。
ポイントは、
append()で配列の要素をその最後尾に追加し、shorten()で配列の最後尾から一つ減らすということです。

2016_06_21_13_55
float[] x = new float[1];  //円のx座標
float[] y = new float[1];  //円のy座標
float[] eSize = new float[1];    //円のサイズ
float[] speed = {1.5};    //円の拡大縮小のスピード
float minSize = 1.0;     //円のサイズの最小値
float maxSize = 100.0;    //円のサイズの最大値

void setup() {
  size(400, 400);
  background(255);
  noStroke();
  fill(0, 127);

  x[0] = width/2;  //最初に一個は中央に表示
  y[0] = height/2;
  eSize[0] = minSize;    //円のサイズを最小値に設定
}

void draw() {
  background(255);

  if (x.length > 0) {
    for (int i = 0; i < x.length; i ++) {
      eSize[i] += speed[i];    //円のサイズを変化させる
      //もし円のサイズが最大値を超えたか最小値未満になったら、方向を変える
      if (eSize[i] > maxSize || eSize[i] < minSize) speed[i] = -speed[i];
      ellipse(x[i], y[i], eSize[i], eSize[i]);    //円を描く
    }
  }
}

void mousePressed() {

  //マウス座標、eSize、スピードを設定して配列の要素を増やす
  x = append(x, mouseX);
  y = append(y, mouseY);
  eSize = append(eSize, random(1.0, 100.0));
  speed = append(speed, random(0.1, 2.0));
}

void keyPressed() {

  //配列の要素がある限りは減らしていく
  //最終的に一つだけになる
  if (x.length > 1) {
    x = shorten(x);
    y = shorten(y);
    eSize = shorten(eSize);
    speed = shorten(speed);
  }
}

このappend()、shorten()を使うと、ユーザがインタラクションする限りいくらでも配列の要素を増やすことができます。マウスの軌跡を記録する1次元配列のサンプルを拡張してみましょう。

2016_06_21_1_46
float[] x = {};  //円のx座標
float[] y = {};  //円のy座標
float[] eSize = {};  //円のサイズ
int counter = 0;  //配列に値を順番に入れるためのカウンター
boolean mouseFlag = false;  //マウスが押されているかを判定するフラッグ

void setup() {
  size(400, 400);
  background(255);
  noStroke();
  fill(0);
}

void draw() {
  //background(255);

  //軌跡を残す場合は、下の3行をON、backgroundをOFFにする
  fill(255, 10);  //透明度のあるrectを描画
  rect(0, 0, width, height);
  fill(0);      //オブジェクトは黒

  //配列の数が0でなく、マウスが押されていなければ描画
  if (x.length > 0 && !mouseFlag) {

    ellipse(x[counter], y[counter], eSize[counter], eSize[counter]);
    counter ++;
    if (counter > x.length-1) counter = 0;  //カウンターが最後までいったらリセット
  }
}

void mousePressed() {
  background(255);
  mouseFlag = true;  //フラッグをON
  
  //配列の要素がある限りは減らしていく
  //最終的に空になる
  while(x.length > 0){
    x = shorten(x);
    y = shorten(y);
    eSize = shorten(eSize);
  }
}

void mouseDragged() {

  //マウスの座標を記録し配列の要素を増やしていく
  x = append(x, mouseX);
  y = append(y, mouseY);
  
  //スピードを記録してeSizeにする
  eSize = append(eSize, dist(mouseX, mouseY, pmouseX, pmouseY)*2);
}

void mouseReleased() {
  
  counter = 0;  //カウンターをリセット
  mouseFlag = false;  //マウスフラッグはOFF
}