fc2ブログ

Processingレクチャー 6回目 その2

6回目の内容をまとめの続きです。

今までは静止画の描画について学んでいきましたが、今回から動画について学習していきます。
静止画では point() や rect() などの関数を用いて描いてきましたが、
これからはその関数自体を構築するという流れになります。


動画を作成するには最低でも2つの決められた関数を構築する必要があります。
また、変数を宣言する場所にも注意が必要になります。

関数内で宣言された変数は「ローカル変数」として扱われ、その関数内でしか使用できません。
例えば、for文では繰り返し回数を制御するために int i などが宣言されますが、
このfor文が終了すればそれらの変数は使用できなくなります。
逆に、関数外で宣言された変数は「グローバル変数」として扱われ、どこからでも使用できます。
その反面プログラムが長くなると、どの関数で変更されているのか把握しづらくなります。


void setup(){
  ~
}

この setup() 関数は起動したときに最初の一回だけ実行され初期設定を行う関数です。
size() や colorMode() 、 background() 、 frameRate() など他にも色々ありますが、
主に変更の必要がない設定をする関数を入力します。
また、宣言されたばかりのグローバル変数の初期化も行ってもよいでしょう。
当然ここで変数を宣言してもローカル変数のため他の関数で扱う事は出来ません。

frameRate(a);
1秒間にa回フレームを更新するように設定します。基本的に30か60しか設定しません。


void draw(){
  ~
}

この draw() 関数は setup() 関数が実行された後に停止するまで繰り返し実行される関数です。
今までの静止画の描画はこのこの関数の1フレームを描画しているというニュアンスになります。

random() を用いたり、この関数内でグローバル変数を変化させて用いたりする事で
描画を変化させる、つまりはアニメーションさせる事が出来ます。
ここで変数を宣言、初期化してから変化させても繰り返される度にリセットされてしまいます。

イメージとしては透明のセル画に描画して、幾重にも重ねるといった感じです。
軌跡を消したければ、draw() 関数の最初に画面を背景色で塗りつぶす命令をします。
軌跡をフェードアウトしたければ、透明度を持った背景色で画面を塗りつぶします。

また、この draw() 関数が繰り返される度に座標情報はリセットされます。
translate() や rotate() など座標情報を変更してアニメーションさせる場合は
グローバル変数を変化させて用いるとよいでしょう。


これらの関数以外にも自分で新しく関数を作り出す事も出来ます。
関数を作る利点は、一連の命令を一つにまとめ名前を付ける事で使いやすくする事です。
一例として以下の関数を見てみます。2つの整数を引数として渡してその和を返す関数です。

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

tashizanは関数の名前です。命名規則は変数のそれと同じです。(参照:3回目のまとめ)

( int a, int b )で引数を設定します。()の中に、変数を宣言するように型と変数名を指定します。
, で区切る事で複数の引数を使用できます。引数を使用しない場合は()の中に何も入力しません。

intの部分で戻り値の型を指定します。戻り値とは最終的に関数で導き出したい値の事です。
関数の中で戻り値とする変数を宣言します。最終的にこの変数の値を関数の値として扱います。
そして関数の最後に返す変数を指定して return を実行する事で戻り値を返します。
なお、intの部分をvoidとした場合は、戻り値を必要としないので return も実行しません。


この関数の使い方の一例を見てみます。

int x = 3;
int y = 5;
int z = tashizan(x, y);

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

zに格納する値として tashizan(x, y) が呼ばれています。引数がxとyなので、
tashizan() 関数では()内で宣言されたaとbにxとyの値である3と5がそれぞれ格納されます。
そして関数内で宣言されたsにaとbの和が格納され戻り値として関数の値として返されます。

その結果、zに tashizan() 関数内の変数sの値が格納される事になります。
見方を変えれば、zに格納される tashizan(x, y) はそれ自体を変数として見る事も出来ます。
int型の変数「tashizan(x, y)」にxとyの和の値が格納されている、というイメージです。


関数は大きく分けて、「戻り値の型がvoid型であるかそれ以外か」、
および「引数があるかないか」の2*2の4パターンがあります。

戻り値がvoid型以外の場合は、先の説明の通り変数のように扱われます。
void型の場合は戻り値を返さないので、関数内の命令を実行するだけになります。
point() や rect() などProcessingで描画に扱う関数はこのvoid型の関数です。

引数を受け取る関数はその引数に応じて導き出される値が変わります。
引数がない関数では呼び出される度に同じ値を返します。
ただし関数内に random() があるならその限りではありません。


1. void型で引数を受け取る関数
rect(x, y, a, b) などでおなじみの引数の値に応じて命令を実行する関数です。
//例 頂点数v、半径rの正多角形を原点を中心に描きます。
void polygon(int v, float r){
  biginShape();
  for(int i = 0; i < v; i++){
    vertex( r*cos(TWO_PI*i/v), r*sin(TWO_PI*i/v) );
  }
  endShape(CLOSE);
}

2. void型で引数のない関数
smooth() や noFill() といった呼ばれる度に同じ命令を実行する関数です。
//例 キャンパス一杯に日の丸を描きます。
void nihon(){
  noStroke();
  background(255);
  fill(255,0,0);
  ellipse(width/2, height/2, width/2, height/2);
}

3. void型以外で引数を受け取る関数
dist(x, y, a, b) や pow(a, b) といった引数の値に応じて計算された値を返す関数です。
//例 加速度accelでtime時間動いた時の距離を求める関数です。
float dash(float accel, float time){
  float distance = accel * sq(time) / 2.0;
  return distance;
}

4. void型以外で引数のない関数
常に同じ値しか返さない関数です。 random() を使わない限り作る意義は薄いです。
//例 サイコロを振って値を得る関数です。
//  random() はfloat型で値を返すので、頭に(int)を入力してint型に変換しています。
int dice(){
  int num = (int)random(6) + 1;
  return num;
}
スポンサーサイト



tag: [Processing]
プロフィール

Moonwalkers

Author:Moonwalkers
メディアアート、インタラクティブメディア制作ゼミ

最新記事
タグクラウドとサーチ

カテゴリ
月別アーカイブ
ディクテーション
Polyglot Free Language Lessons Online
リンク
Twitter
検索フォーム
RSSリンクの表示
QRコード
QRコード