これまでに、 background()circle() といった関数を使ってプログラムを書いてきました。Processing(に限らず、多くのプログラミング言語)では、自分で関数を作成することができます。関数の作り方を身につけると、より洗練されたプログラムを書くことができるようになります。


まずは書いてみる(その1)

(1ー1)

void setup()
{
  size(800, 600);
}

void drawShapes() {
  int x = 400;
  int y = 300;
  
  fill(128);
  stroke(240);
  strokeWeight(5);

  circle(x-20, y+10, 40);
  rect(x-20, y-30, 40, 40, 2);
  triangle(x-10, y+35, x+40, y+35, x+15, y-5);
}

void draw()
{
  background(240);
  drawShapes();
}

(1ー2)

void setup()
{
  size(800, 600);
}

void drawShapes(int x, int y) {
  fill(128);
  stroke(240);
  strokeWeight(5);

  circle(x-20, y+10, 40);
  rect(x-20, y-30, 40, 40, 2);
  triangle(x-10, y+35, x+40, y+35, x+15, y-5);
}

void draw()
{
  background(240);
  drawShapes(400, 300);
}

(1ー3)

void setup()
{
  size(800, 600);
}

void drawShapes(int x, int y) {
  fill(128);
  stroke(240);
  strokeWeight(5);

  circle(x-20, y+10, 40);
  rect(x-20, y-30, 40, 40, 2);
  triangle(x-10, y+35, x+40, y+35, x+15, y-5);
}

void draw()
{
  background(240);
  drawShapes(400, 300);
  drawShapes(500, 300);
  drawShapes(400, 400);
  drawShapes(500, 400);
}

関数は、「処理をひとまとめにして、名前をつけたもの」というイメージです。 似たような処理(この場合は図形の描画)を何回も書かなくて済むので、プログラムの見通しが良くなり、考えやすくなります。

上記の例では、drawShapes という(プログラマが適当につけた)名前の関数を作っています(関数の定義)。 作成した関数 drawShapes()draw() の中で使っています。

(1ー2)と(1ー3)の例では、関数に値を渡しています。関数に与える値( drawShapes(400, 300);400, 300)を「引数」と呼びます。

図8_01.png


まずは書いてみる(その2)

(2ー1)

void setup()
{
  size(800, 600);
}

float average(float a, float b) {
  float r;
  r = (a + b) / 2;
  return r;
}

void draw()
{
  background(255);
  float c = average(500, 200);
  
  fill(0);
  textSize(60);
  text(c, 400, 300);
}

(2ー2)

void setup()
{
  size(800, 600);
}

float average(float a, float b) {
  return (a + b) / 2;
}

void draw()
{
  background(255);
  fill(0);
  circle(300, 200, 20);
  circle(mouseX, mouseY, 20);
  
  float x = average(300, mouseX);
  float y = average(200, mouseY);
  circle(x, y, 20);
}

この例では、average という(これもプログラマが適当につけた)名前の関数を定義しています。

プログラム中の

float average(float a, float b)

の冒頭(average の前)に float とあります。 これは、関数 average は、float 型の値を返すという意味です。 もし、整数を返したければ、冒頭の部分は int average(…) になります。 特に値を返さない場合は void average(…) と書きます。

図8_02.png


まずは書いてみる(その3)

(3ー1)

void setup()
{
  size(800, 600);
}

float larger(float a, float b) {
  if(a > b) {
    return a;
  } else {
    return b;
  }
}

void draw()
{
  background(255);
  fill(0);
  
  float c = larger(mouseX, width/2);
  textSize(60);
  text(c, 400, 300);
}

(3ー2)

void setup()
{
  size(800, 600);
}

float larger(float a, float b) {
  if(a > b) {
    return a;
  } else {
    return b;
  }
}

void draw()
{
  background(255);
  fill(0);
  line(0, height/2, width, height/2);
  line(width/2, 0, width/2, height);
  
  float x = larger(mouseX, width/2);
  float y = larger(mouseY, height/2);
  circle(x, y, 20);
}

2つの値 ab を引数にとって、大きい方の値を返す関数 float larger(float a, float b) を作成しています。 larger もプログラマが適当につけた関数名です。