導入
本記事では,Processingのアニメーションの基礎について述べる.
アニメーションの概念
アニメーションは,パラパラ漫画のように,一枚ずつ絵を作りそれを一秒間に複数回更新することで行われる.
一枚の絵の事を「フレーム」と呼ぶ.
frameRate();は,一秒間に何回更新するかを指定する.
一枚絵とは異なり,プログラムは,初回時のみ実行される初期設定のためのsetupブロックと,連続した一枚絵を書く事を示すdrawブロックに分かれる.
下記のコードでは,drawブロックの中で,描画する位置のxを1フレームごとに更新しているため,左から右へ動いているように見える.
int x=0; //図形描画に使うxとyを宣言しておく int y=240; void setup(){ size(640, 480); colorMode(RGB, 255); background(255,255,255); //背景色の指定 frameRate(10); //一秒間に何回画面を更新するか. } void draw(){ //アニメーションする図形の描画 fill(100, 100, 100); ellipse(x, y, 20,20); x++; //xの値をフレームごとに+1していく,つまり次のフレームではxが+1された状態になる. }
画面のリフレッシュ
ただ連続して描画していくだけでは,上書きされていくだけなので,各フレームの描画の時に,画面をbackgroundと同じ色でリフレッシュする必要がある.
この画面のリフレッシュは,Processingでは,backgroundと同じ色の四角を画面全体に貼付ける事で行う.
int x=0; int y=240; void setup(){ size(640, 480); colorMode(RGB, 255); background(255,255,255); frameRate(10); } void draw(){ //リフレッシュするための四角の描画 fill(255,255,255); //四角の色をbackgroundと同じにする. noStroke(); //描画する四角の枠線を書かないように指定する. rect(0, 0, width, height); //画面全体に四角を描画する. //widthとheightは最初から用意されている変数で,size();で指定した値が入っている. //アニメーションする図形の描画 fill(100, 100, 100); stroke(0, 0, 0); //黒(RGB:0,0,0)の枠線を付ける ellipse(x, y, 20,20); x++; }
また,透明度を表すα値を貼付ける四角の色に指定する事で,前のフレームの絵が徐々に消えていくという効果を演出する事が出来る.
以下のコードを実行すると,絵が徐々に消えていく効果を出す事が出来る.
float x=0; float y=240; void setup(){ size(640, 480); colorMode(RGB, 255); background(255,255,255); frameRate(10); } void draw(){ fill(255, 255, 255, 60); //最後の60は,透明度,つまりどれだけ残像が残るかを表す noStroke(); rect(0, 0, width, height); fill(100, 100, 100); stroke(0, 0, 0, 0); ellipse(x, y, 20,20); x++; }
以下はrandomと透過を組み合わせて効果的に使ったアニメーションの例である.
void setup(){ size(640, 480); colorMode(RGB, 255); background(255,255,255); frameRate(10); } void draw(){ fill(255, 255, 255, 60); noStroke(); rect(0, 0, width, height); for(int i=0; i<3; i++){ //パステル調にするために,RGBの値を100~255にする. int r = (int)random(155) + 100; int g = (int)random(155) + 100; int b = (int)random(155) + 100; int x = (int)random(width); //xの位置は0~width(キャンバスの横幅) int y = (int)random(height); //yの位置は0~height(キャンバスの縦長) int w = (int)random(20) + 20; //大きさは20~40 fill(r, g, b); ellipse(x, y, w, w); } }

if文を使ったオブジェクトの跳ね返り
xdirection(xの動かす方向)という変数を用意し,xの値を加算する時にこの変数を用いて,枠からはみ出した時は,xdiretionを変更することで,跳ね返りを実現する事が出来る.
以下のコードを実行すると,xがキャンバスの幅の変数widthを越えた時と,xが0以下になった時に跳ね返りが起きる.
float x=0; float y=240; float xdirection = 1; void setup(){ size(640, 480); colorMode(RGB, 255); background(255,255,255); frameRate(10); } void draw(){ fill(255, 255, 255, 60); noStroke(); rect(0, 0, width, height); fill(100, 100, 100); stroke(0, 0, 0, 0); ellipse(x, y, 20,20); if(x > width){ xdirection = -1; } if(x < 0){ xdirection = 1; } x = x + (xdirection * 10); }