Processing

12. 関数で処理をまとめる

プログラムでは、良く利用する複数の命令を独自の処理としてまとめるためなどに、関数というものが定義できます。

関数の利用にはプログラムを簡素化できる、機能や意味の単位に分割し分かりやすくするなどのメリットがあります。

プログラムを分割する

Processingで独自の関数を作る場合には、まずプログラム全体をProcessingで定められた形式に分割をします。

例えば、以下は「10. ランダム」で作ったプログラムです。

size( 500, 500 );
background( 255 );

for( int i = 0; i < 100; i++ ) {
  line( random( 500 ), 0, random( 500 ), 500 ); 
}

このプログラムですが、先頭の2行はファイルを開いたときの設定(初期設定)であり、それ以降の3行は描画処理であり、2つにその内容を分けて考えることができます。

Processingではこのような場合、以下のように書きます。

void setup() {
  size( 500, 500 );
  background( 255 );
}

void draw() {
  for( int i = 0; i < 100; i++ ) {
    line( random( 500 ), 0, random( 500 ), 500 ); 
  }
}

1行目のvoid setup() {から、4行目の}までの間の行に、ファイルを開いたときの初期設定に関するプログラムをまとめます。

6行目のvoid draw() {から、10行目の}までの間の行に、描画処理に関するプログラムをまとめます。

setup()とdraw()というのは、Processingであらかじめ用意されている関数ですが、このように初期設定と描画処理を分けて書くのが、Processingの定番です。

なお、この状態で、プログラムを実行すると(ぜひやってみて下さい)、画面がすぐに真っ黒になってしまうと思います。

これは実はdraw()というのは、基本的にはプログラムが実行されている間中、繰返し何度も実行されているからです。

つまり、draw()の中に書いたことは、何もプログラムしなくても何回も繰返されるということです。

試しに、draw()を以下のように書きかえてみて下さい。

void draw() {
  background( 255 );
  for( int i = 0; i < 100; i++ ) {
    line( random( 500 ), 0, random( 500 ), 500 ); 
  }
}

background( 255 );という背景を白にする処理を付け加えました。

上記であれば、真っ黒になることはありませんが、線は100本単位でランダムに位置を変え、何度も繰返し描かれるはずです。

これはdraw()の中に書かれた、「背景を白にする」→「100本の線を描く」という処理を何回も繰返しているからです。

draw()のことをメインループと読んだりしますが、この機能のためにProcessingはプログラムによるアニメーションなどの作成や動作確認が用意に行えます。

draw()の繰返しを行いたくなければ、setup()の中にnoLoop();という命令を書いておけば、draw()の実行は1度きりになります。

void setup() {
  size( 500, 500 );
  background( 255 );
  noLoop();
}

void draw() {
  background( 255 );
  for( int i = 0; i < 100; i++ ) {
    line( random( 500 ), 0, random( 500 ), 500 ); 
  }
}

ページの先頭へ↑

独自の関数を作る

関数を作る際の書式は以下のようになります。

戻り値 関数名( 引数 ) {
関数として行う処理;
}

setup()もdraw()も、プログラマが独自に処理を書くことを想定して用意された関数ですので、上記の書式に当てはまっているかと思います。

戻り値、というのは関数が処理の結果返す値のことで、戻り値がない場合はvoidと書きます。ある場合は戻るデータの型に応じて、int、floatなどと記述します

関数名も変数名同様、半角英数字と_(アンダーバー)のみが使用でき先頭は英字のみになります。

引数とは関数に渡す値のことで、値を渡す必要がなければ()内には何も書く必要がありません。必要がある場合は()の中に変数を定義するような形式で指定します。

関数名に続く{から}終わりまでの間に、関数として行う処理を書きます。

void setup() {
  size( 500, 500 );
  background( 255 );
  noLoop();
}

void draw() {
  int ans = tashizan( 2, 5 );
  println( ans );
}

int tashizan( int a, int b ) {
  return a + b; 
}

上記は、引数と戻り値がある独自に作った関数の一例です。setup()やdraw()とは区別して書きます。

12〜14行目で独自の関数を作っています。整数の足し算を行う関数なので、戻り値にintを指定し、関数の名前をtashizan、()の中では,で区切って2つの整数を引数として受け取るということを、変数の定義に似た形式で書きます。

実際にtashizan()という関数が使われているのは、draw()関数の中、8行目です。引数として2と5という整数が書かれています。tashizan( 2, 5 )が実行されると、その処理の内実は12〜14行目の定義に従って行われます。2はaに、5はbに相当しますので、処理としてはa+bが計算され、その結果が呼び出し元に返されます。つまりtashiza( 2, 5 )が実行されると、その部分は7という数値になるということです。

その7が変数ansに代入され、9行目のprintlnによって画面下部に出力されます。

「13. 描画の単位を考える」から、独自の関数を描画のために使います。

ページの先頭へ↑

< 11. プログラムを汎用的にする

13. 描画の単位を考える >