以下のプログラムを見やすくすることを考えると,
// 定数 final float gravity = 9.8 / 60; // <-- 1/60秒あたりの重力加速度 // 変数 float y; // <-- ボールのy座標 float vy; // <-- ボールの速度のy成分 void setup() { size(200, 480); noStroke(); fill(0, 0, 0); y = 0; vy = 0; } void draw() { vy += gravity; // <-- 速度に重力加速度を加算する y += vy; // <-- ボールが速度ぶん移動する background(255, 255, 255); ellipse(100, y, 40, 40); }
ボールを描いている,
ellipse(100, y, 40, 40);
は,引数に直接値を指定しており,プログラムの見やすさとしてはよろしくない.そこで,変数を使用し,
ellipse(x, y, d, d);
とする.
課題を進めていくと,ボールのために
float x; //x座標 float y; //y座標 float vx; //x方向速度 float vy; //y方向速度
という4つのグローバル変数ができる.しかしながら,再度プログラムの見やすさという観点からすれば,
float ボールの情報;
として,まとめたい.そこで配列の出番である.
float[] ball0;
ただし,配列はnew演算子を使用し,メモリ上に実際に値を記憶する領域を作らなければ使えない.また,プログラム中にball0[0]と書かれても,この値が何を示しているのか分からないので,添え字に定数を使用する.
... final int X = 0; final int Y = 1; final int VX = 2; final int VY = 3; float[] ball0; ... void setup(){ ... ball0 = new float[4]; ball0[X] = ...; ball0[Y] = ...; ... ... }
さらに課題を進めていくと,
void draw(){ background(0, 0, 100); //画面を白(HSB)でぬりつぶす //ボールを動かす ... ... ... ... //ボールを描く ellipse(ball0[X], ball0[Y], d, d); }
となっていく.またプログラムを見やすくるのであれば,自分で関数を作り,
void draw(){ background(0, 0, 100); //画面を白(HSB)でぬりつぶす //ボールを動かす ボールを動かす(動かすボール); //ボールを描く ellipse(ball0[X], ball0[Y], d, d); }
としたい.
ボールを動かす関数を作ることを考える.
1と2から,
void boundBall(){ }
3は,今,1個のボールの情報を1つのfloatの配列にまとめているので,引数(入力)にはfloatの配列を指定できるようにしなければならない.よって,
void boundBall(float[] b){ //ボールbを動かす処理 ... ... ... }
となる.
基本的な再帰を使ったプログラム(階乗を計算する).使いどころによっては,プログラムを見やすく短くすることができる.
void setup(){ int x = 5; int y; y = factorial(x); println(x + "!=" + y); } int factorial(int x){ if (x <= 0) return 1; else return x * factorial(x-1); }