第3回 関数(メソッド)

    
1 Processingの Active Mode と Static Mode
 
・Processingでは実行時、2つのModeがある
 - どちらのモードで実行するか、はソースの書き方で自動的に判別される
 
(1) Static Mode
 - 静的な記述、ソースの上から下へ順番に(逐次)実行される
  
 
 
(2) Active Mode
 - 関数(メソッド)を記述してプログラムを構成する
 - C言語の形式に近い
 - グローバル変数(的な?)も利用可
 - void setup() 関数から実行開始
  
   
  
 
2 関数の呼び出し
  
・関数は以下のようにして呼び出す
 - setup()関数から処理が始まる
 
void setup() // <-- プログラム実行開始後、最初にシステムから呼ばれる
{
  println("計算");
  keisan();  // <-- 関数呼び出し
}

void keisan()
// <-- setup()関数から呼ばれる関数
{
  int a = 5;
  println("a*a = " + (a*a) );
}

   
 
  

setup()関数とdraw()関数は特別な関数
 - setup()関数 ・・・ プログラム開始直後、最初にシステムから呼び出される
 - draw()関数 ・・・ プログラムが終了するまで、常にシステムから1秒間に60回(変更可)呼び出される
 
 
  
3 変数の有効範囲
   
・変数宣言の位置によって、有効範囲が異なる
 - プログラム全体で(どの関数でも)利用可能な場合
int a; //(※) <-- ここに宣言すると、どこからでも参照可能となる

void setup()

{
  a = 5; //(※)のaに5を代入
  println("計算");
  keisan();
}

void keisan()

{
  println("a*a = " + (a*a) );
//(※)のaを参照できる
}
   
 - 以下の場合はエラーとなる
void setup()
{
  int a = 5; //(#) <-- 関数の内部で宣言、有効範囲はこの関数の中だけ
  println("計算");
  keisan();
}

void keisan()

{
  println("a*a = " + (a*a) ); //
(#)のaは参照できない、エラーとなる
}

   
   
  
4 関数の引数
   
・関数を呼び出すとき、値を渡すことができる
 - 渡す値(関数が受け取る値)のことを引数(ひきすう)」と呼ぶ
void setup()
{
  int x = 5;
  println("計算");
  keisan2(x); // 引数として x の値を渡す
}

void keisan2(int a) // aに上記 x の値が代入される
(ここでは5)
{
  println("a*a = " + (a*a) );

}
   
 - 引数の変数の型は基本的に 呼び出し側呼ばれる側 で同じにしないとダメ
 - 以下は、良くない例(Processingでは、とりあえず実行できるけど)
void setup()
{
  int x = 5;
  println("計算");
  keisan2(x);//関数の引数はdouble型なのに、int型の変数の値を渡そうとしている
}

void keisan2(double a)

{
  println("a*a = " + (a*a) );

}
   
 
・複数個の引数
 - 同時に複数の引数を渡すことができる
 - 呼び出し側、呼ばれる側において、引数の 個数、型 を同じにする必要がある
void setup()
{
  int x = 7, y = 4;
  println("計算");
  keisan3(x,y); // 引数として x,y の値を渡す
}

void keisan3(int a, int b) // a,bに上記 x,y の値がそれぞれ代入される
{
  println(a + " - " + b + " = " + (a-b) );

}
     
 - 異なる型の組み合わせもOK
void setup()
{
  int v = 3;
  double pai = 3.14;
  boolean f = true;

  keisan4(v,pai,f); // 異なる型の3つの引数を渡す
}

void keisan4(int w, double d, boolean b)
{
  if( b==true ){
    println("値 = " + w + ", " + d);
  }

}
      
   
  
5 関数の戻り値
   
・関数は戻り値を返すことができる
 - 呼び出し元に値を1個返す(戻す)、 「return」を使う
 - 戻り値の型が int型の場合、関数の接頭語がvoidからintに変わる
 - 戻り値の変数の型と同じにすること(下記では retint型 なので、関数の接頭語も int型 になっている)
 - 戻り値がない場合の関数の接頭語は「void
  
void setup()
{
  int x, y;
  int w = 6;

  x = keisan5( 3, 8 ); // 戻り値をxに代入する
  y = keisan5( w, 4 ); // 戻り値をyに代入する
  println("x=" + x + ", y=" + y);
}
// aとbを足し算して、その結果を返す関数
int keisan5(int a, int b)

{
  int ret;
  ret = a + b;

  return ret; // retの値を戻り値として呼び出し元に返す
}
   
 - 戻り値の型が boolean型 の場合、下記のようになる
void setup()
{
  int v = 5;

  if( isKisu(v)==true ){ //
isKisu(v)の戻り値が true であれば
    println("奇数");
  }else{
    println("偶数");
  }
}
// aが奇数であればtrue、
偶数であればfalseを返す関数
boolean isKisu(int a)

{
  if( a%2==1 ){
    return true; // 奇数だった
  }
  return false; // 偶数だった
}
   
・Javaでは複数個の戻り値を返すことはできない
  
   
  
6 Processingの draw() 関数
   
・Processingで draw()関数 は特別な関数
 - プログラム実行中、自動的にシステムから1秒間に60回呼ばれる(デフォルトは60fps)
 
 - draw()関数が呼ばれるごとにカウントアップ、表示する
int cnt; // カウンタの変数

void setup()

{
  cnt = 0;
}
void draw()
{
  println("cnt = " + (++cnt));
}
   
 - fpsを10に設定する、 frameRate(); 関数を呼び出す
int cnt;

void setup()

{
  frameRate(10); // fpsを10にする
  cnt = 0;
}
void draw()
{
  println("cnt = " + (++cnt));
}
   
 - frameCount変数は特別な変数draw()関数が呼び出された回数が記録されている(Processingのみ、Javaにはない)
  
 - frameCountを表示する例
void setup()
{
  frameRate(10); // fpsを10にする

}
void draw()
{
  println("cnt = " + frameCount );
}
  
 
    
  
draw()関数 で毎回画面を初期化(画面をまっさらに)する
 - draw()関数で描画処理を行う前に、 background(255); を実行すると、画面が初期化される
 - 初期化しないと、それまでに描画した跡が残る

<〇が左から右に移動するサンプルプログラム>
int x;
void setup()
{
  size(400, 400);
  background(255);
  x = 0;
}
void draw()
{
  background(255); // <--これがあると、毎回、描画前に画面がきれいになる
  ellipse( x, 200, 40, 40 );
  x += 1; 
}

 
 background(255);を削除すると、右図のようになる
  
  
   
  
7 Processingのマウス操作
   
・Processingでマウスの座標を得る

 - mouseX、mouseY 変数は Processing の特別な変数で、現在のマウスポインタの位置(xy座標)が格納されている
 - mouseX、mouseY を表示する、その位置にを描画する
void setup()
{
  size(400, 400);
}

void draw()
{
  background(255);
  println( mouseX + "," + mouseY );
  ellipse( mouseX, mouseY, 20, 20);
}

   
  
・マウスボタンが押されたときの処理

 - マウスボタンが 押されている/押されていない の情報はリアルタイム mousePressed 変数に格納される
  
 - マウスボタンを押している間、●になる
void setup()
{
  size(400, 400);
}

void draw()
{
  background(255);
  if( mousePressed==true ) fill( 0 ); else noFill();
  ellipse( 200, 200, 50, 50 );
}

 
   
・マウスボタンが押されたときに呼ばれる関数
 
 - void mousePressed() 関数はマウスボタンが1回押される1回呼ばれる
 
 - マウスボタンを押したところにを描画する
void setup()
{
  size(400, 400);
  background(255);
  strokeWeight(3);
}

void draw(){}

void mousePressed()
{
  line( mouseX-10, mouseY-10, mouseX+10, mouseY+10 );
  line( mouseX+10, mouseY-10, mouseX-10, mouseY+10 );
}

    
   
 
 演習
   
  演習のページへ