processing #9 RandomWalkっぽい
最近パーティクルとかをやりたくなったので、とりあえずRandomWalkっぽいのを作って、インスタンス配列の使い方とかの復習しようと思って、書いてみました。インスタンス配列について自分の理解が間違っていたらコメントで指摘よろしくお願いします。
とりあえすインスタンスの配列を組むための宣言は、setup()の外側に
データ型[] 配列名
setup()の中に
配列名 = new データ型[要素数]
データ型っていうのは、今回の場合はクラス名って思えば大丈夫だと思います。
そんな感じで各インスタンスを入れる箱を用意したので、そこにインスタンスを投げ込んで行きます。
walk[] runs;
void setup(){
size(600,600);
background(255);
runs = new walk[4];
runs[0] = new walk(1);
runs[1] = new walk(1);
runs[2] = new walk(2);
runs[3] = new walk(2);
}
void draw(){
background(255);
rect(50,50,500,500);
line(300,50,300,550);
line(50,300,550,300);
for(int a=0;a<4;a++){
runs[a].update();
runs[a].display();
}
}
次にwalkクラス
こっちは特に難しくなくて、とりあえず左上と右下を行き来するのに、どのように動くかをランダムに決めて表示するようにしています。
最初は、クラス作るときは
・コンストラクタ
・update()メソッド
・display()メソッド
さえあれば、なんとかなる...と思ってる
class walk {
PVector position;
PVector velocitiy;
int swit=0;
int r=2;
walk(int b) {
position = new PVector(50, 50);
r=b;
}
void update() {
if (swit==0) {
if (position.y==50) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(r, 0);
} else if (position.x==50
|| position.x==300 ) {
float a=0;
a=random(1);
if (a<0.5) {
position.add(r, 0);
}
else {
position.add(0, r);
}
}
else if (position.x==550) {
position.add(0, r);
}
}
else if (position.y>50 && position.y<300) {
if (swit==0) {
position.add(0, r);
}
else if (swit==1) {
position.add(0, -r);
}
}
else if (position.y==300) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(r, 0);
}
else if (position.x==50
|| position.x==300 ) {
float a=0;
a=random(1);
if (a<0.5) {
position.add(r, 0);
}
else {
position.add(0, r);
}
}
else if (position.x==550) {
position.add(0, r);
}
}
else if (position.y>300 && position.y<550) {
if (swit==0) {
position.add(0, r);
}
else if (swit==1) {
position.add(0, -r);
}
}
else if (position.y==550) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(r, 0);
}
else if (position.x==50
|| position.x==300 ) {
position.add(r, 0);
}
else if (position.x==550) {
position.add(0, -r);
swit=1;
}
}
}
else if(swit==1){
if (position.y==550) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(-r, 0);
}
else if (position.x==50
|| position.x==300 ) {
float a=0;
a=random(1);
if (a<0.5) {
position.add(-r, 0);
}
else {
position.add(0, -r);
}
}
}
else if (position.y>300 && position.y<550) {
position.add(0, -r);
}
else if (position.y==300) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(-r, 0);
}
else if (position.x==550
|| position.x==300 ) {
float a=0;
a=random(1);
if (a<0.5) {
position.add(-r, 0);
}
else {
position.add(0, -r);
}
}
else if (position.x==50) {
position.add(0, -r);
}
}
else if (position.y>50 && position.y<300) {
position.add(0, -r);
}
if (position.y==50) {
if (position.x>50 && position.x<300
|| position.x>300 && position.x<550) {
position.add(-r, 0);
} else if (position.x==550
|| position.x==300 ) {
position.add(-r, 0);
}
else if (position.x==50) {
swit=0;
position.add(0, r);
}
}
}
}
void display() {
ellipse(position.x, position.y, 20, 20);
}
}
このぐらいなら、インスタンスの配列を使わなくてもいいと思うけど、扱いたいインスタンスが増えてきたら、配列にしたりもっと自由度を効かせたいならArrayListを使った方がいいなーって思ってます。でもArrayListは結構重くて、最初は、クラスの作り方から入って、インスタンスの配列、でArrayListって感じで学んだら結構飲み込みやすいなって個人的に思います。
実行結果
次はきっとrandomWalkのコードを軽量化しながら、総当たりに距離測って色をーとかしていこうかなって思います。
Happy Coding!