導入
本記事では,Processingの配列について述べる.
配列の概念
配列とは,一つのデータ型(本記事では整数型「int」)を多数まとめて管理するものである.
沢山の円を個別に動かすアニメーションを考えてみる.この時1つの円につきx座標とy座標,xが進む方向,yが進む方向,動くスピードの,5つの値を保持するための変数を必要とする.
そして,例えば100個の円を同時に動かすアニメーションを作りたい時には,前述の「5つの変数*100個の円=500個」の変数が必要となる.実際にはソースコードに500個の変数を書く事は出来ない.
そこで,同じ用途の変数をまとめて一つの変数のような名前を与えて,管理しやすくしたものが,「配列」である.
intの配列は,
int 配列名[] = new int[サイズ];
という形で宣言を行う.
例えば,
int intArray[] = new int[10];
と書くと,int変数を10個格納できるintArrayという名前の配列を宣言する事が出来る.
配列の各変数にアクセスするためには,以下のような書法を使う.
intArray[0] = 10; //intArrayという配列の1番目の格納変数に10を代入する intArray[3] = 5; //intArrayの4番目に5を代入する int x = intArray[5]; //変数xにintArrayの6番目に格納されている値を代入する
以上の用に大括弧[]の中身に0~の値を与える事(添字)で,配列の中身を使う事が出来る.
(1~ではない事に注意)
for文と配列
配列はfor文と非常に相性がいい.
for文で用いるカウンタを配列の添字として用いるのが一般的である.
以下のコードは100個の変数を保持できる(サイズ100)を持つ配列の中にRandomで発生させた値を格納してから描画を行っている.
int xArray[] = new int[100]; //サイズ100の配列を宣言する int yArray[] = new int[100]; void setup(){ size(640, 480); colorMode(RGB, 255); background(255, 255, 255); frameRate(10); for(int i=0; i<100; i++){ //for文のカウンタ変数iを添字として使い配列に代入する xArray[i] = (int)random(640); yArray[i] = (int)random(480); } } void draw(){ noStroke(); fill(255,255,255); rect(0, 0, width, height); stroke(0, 0, 0); fill(100, 100, 100); for(int i=0; i<100; i++){ //for文のカウンタ変数iを使って配列にアクセスし値を取り出す ellipse(xArray[i], yArray[i], 10, 10); } }
以下のコードでは,方向も移動速度もバラバラな100個の円をアニメーションさせている.
int xArray[] = new int[100]; int yArray[] = new int[100]; int xspeed[] = new int[100]; //移動速度を格納する配列 int xdirection[] = new int[100]; //移動方向を格納する配列 void setup(){ size(640, 480); colorMode(RGB, 255); background(255, 255, 255); frameRate(10); for(int i=0; i<100; i++){ xArray[i] = (int)random(640); yArray[i] = (int)random(480); xspeed[i] = (int)random(15) + 5; //5~20の値をrandomで発生させて配列に格納 //0~2の値をrandom発生させて,1以下なら正方に,1以上なら負方向に動かすことを決め,配列に格納 if(random(2) < 1){ xdirection[i] = 1; } else{ xdirection[i] = -1; } } } void draw(){ noStroke(); fill(255,255,255); rect(0, 0, width, height); stroke(0, 0, 0); fill(100, 100, 100); for(int i=0; i<100; i++){ ellipse(xArray[i], yArray[i], 10, 10); //反転させる if(xArray[i] > 640){ xdirection[i] = -1; } else if(xArray[i] < 0){ xdirection[i] = 1; } //次のフレームのx座標を決める xArray[i] += xdirection[i] * xspeed[i]; } }