導入
本記事では,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];
}
}