メソッドは 名前(<値のリスト>) の形式で、一つの文で各種の処理を実行する機能です。println() も一種のメソッドです。メソッドは定義されたものを利用するだけでなく、自分で定義することも可能です。
ここでは、メソッドの利用や定義の方法を紹介します。
double r = sqrt(2.0); //平方根 double r = power (3.2,3); //べき乗sqrt がメソッドの名前で () 内の 2.0 を引数と呼びます。この場合 2.0 の平方根がメソッドの「返す値」となります。メソッドの実行はメソッドの「呼び出し」とも言います。Processing では calculation(計算:17種)、trigonometry(三角関数:9種)、などの分野で多くのメソッドが用意されています。こんなメソッドもあります。
int y = constrain( val, min,max); //val の値を minとmaxの間に制限する foat n = norm(val,min,max); //minとmaxの範囲の値であるvalを、0と1の間の範囲の数に変換(正規化)する。 float n = map (va,min,max,Min,Max); //minとmaxの範囲の値であるvalを MinとMaxの範囲の数に変換(map)するメソッドは数学的関数だけでなく、グラフィック、音、ネットワーク、通信、などメディア関連のいろいろな機能を提供してくれます。println() もメソッドの仲間です。
//関数の定義
double f(double x){
return x*x + 2.0*x + 3.0;
}
void setup(){
println(f(2.0));
}
///11.0
関数 f() が定義されば、f(2)で x=2 の値(この場合11)を得ることができます。setup() 関数は Processing が
active モードで実行するときに最初に一度だけ実行する関数で、先頭の void はこの関数は何も値を返さないことを意味します。setup()を定義しないで、いきなり、自作の関数を呼び出すと次のエラー(activeとstaticモードの混同利用)がでます。//エラーになる
println(f(2.0));
//関数の定義
double f(double x){
return x*x + 2.0*x + 3.0;
}
///It looks like you're mixing "active" and "static" modes.
変数 = メソッド名(<引数>);メソッドで戻す値は、左辺の変数に渡されます。また、メソッドを呼び出すとき「引数」により処理に必要なデータを渡すことができます。メソッドの型が void である場合、あるいは、値を受け取る必要がないばあい ”変数 =” は省略できます。
void setup(){
int x=0;
f(x);
println(x);
}
//関数の定義
void f(int x){
x=1;
}
///結果
0
int y=0;
void setup(){
int x=0;
y=0;
f(x);
println(y);
}
//関数の定義
void f(int x){
x=1; y=1; //y は広域変数
}
///結果
1
小さなプログラムでは広域変数で定義する方が便利そうですが、大きなプログラムになると「どこかのメソッドで勝手に変数の値が変更されてしまう」事態になりかねません。また、特定のメソッドだけで利用する変数を広域変数にすると広域変数の数が多くなり、プログラムがわかりにくくなります。void setup(){
for(int i=0;i<10;i++){
}
for(i=0;i<10;i++){
}
}
///cannot find anything named "i"
メモリの割り当てとゴミ集めあるブロック(メソッド)で宣言された変数(もの)は、その「内部のみで利用される」原則は名前の重複利用を避ける意味もありますが、記憶領域(メモリー)の有効利用にもなります。ある関数内部で利用された大きな配列はそのメソッドが終了すると利用できなくなりますが、逆に考えるとその配列が利用していたメモリーを再利用できることになります。
void setup(){
int[] ary={5,10,7};
f(ary);
println(ary[0]);
}
void f(int[] ary){
ary[0]=0;
}
この違いは、メソッドへの渡し方にあります。整数や配列などは、計算機のメモリー中である場所(メモリーの「番地」とも言います)が割り当てられます。整数や少数など「単純変数(newで生成しない)」は、その「値」を渡しますが、配列など一般に
new を利用して生成する「もの」は、「もの」のある「場所」を渡します。int dia;
int inc;
void setup(){
size(150,150);//画面のサイズ
frameRate(20);//秒あたりのフレーム数
dia=50;
inc=2;
}
void draw(){
background(250);//背景色で塗る
//中心から 直径diaの円を描く
ellipse(width/2,height/2,dia,dia);
//直径を変更
dia=dia+inc;
//幅より大きいか、10以下なら反転
if(dia>width || dia<10) inc=-inc;
}
実行画面
int px,py;
void setup(){
size(150,150);
px=width/2;//初期値
py=height/2;
}
void draw(){
//background(200);
ellipse(px,py,10,10);//円を描く
}
void mousePressed(){
//マウスボタンが押された
px=mouseX;//マウスのx座標
py=mouseY;
}
実行画面
mouseReleased():マウスボタンが離れた mouseMoved():マウスが移動した mouseDragged():マウスボタンを押したまま移動した
int px,py;
void setup(){
size(150,150);
px=width/2;//初期値
py=height/2;
}
void draw(){
background(200);
ellipse(px,py,10,10);
}
void keyPressed(){
//キーが押された
if (key == CODED){
if(keyCode == UP) py = py - 10;
if(keyCode == DOWN) py = py + 10;
if(keyCode == LEFT) px = px - 10;
if(keyCode == RIGHT) px = px + 10;
}
if(key == 'r') fill(255,128,0);
if(key == 'b') fill(0,0,0);
}
実行画面