次のスケッチは、画面上を1個のキャラクタが動くプログラムである。
float x, y, dx, dy, d; void setup(){ size( 400, 300 ); x = -1; y = 0; dx = 0; dy = 0; d = 1; } void draw(){ background( 0 ); fill( color( 0, 0, 240 ) ); rect( x, y, 40, 60 ); fill( color( 255, 255, 255 ) ); ellipse( x + 15, y + 20, 10, 15 ); ellipse( x + 25, y + 20, 10, 15 ); fill( color( 0, 0, 0 ) ); ellipse( x + 15 + dx * d, y + 20 + dy * d, 5, 5 ); ellipse( x + 25 + dx * d, y + 20 + dy * d, 5, 5 ); x = x + dx; y = y + dy; if( x<0 || x>width || y<0 || y>height ){ x = random( 10, width-10 ); y = random( 10, height-10 ); switch( int(random(4) ) ){ case 0: dx = 0; dy = 2; break; case 1: dx = 0; dy = -2; break; case 2: dx = 2; dy = 0; break; default: dx = -2; dy = 0; break; } } if( frameCount % 60 == 0 ) d = 1; if( frameCount % 60 == 40 ) d = -1; }
キャラクタの位置はx, y、動く方向はdx, dy、目の向きはdで保持されている。 もっと複雑なプログラムになると、それぞれの変数が何に関係しているのかがわかりにくくなる。そこで、これらの属性をもつキャラクタを一つのまとまりとして定義してみる。 そのための仕組みがクラスである。 次の例はMonsterという名前のクラスを定義している。
class Monster{ float x, y, dx, dy, d; Monster(){ x = -1; y = 0; dx = 0; dy = 0; d = 1; } void move(){ fill( color( 0, 0, 240 ) ); rect( x, y, 40, 60 ); fill( color( 255, 255, 255 ) ); ellipse( x + 15, y + 20, 10, 15 ); ellipse( x + 25, y + 20, 10, 15 ); fill( color( 0, 0, 0 ) ); ellipse( x + 15 + dx * d, y + 20 + dy * d, 5, 5 ); ellipse( x + 25 + dx * d, y + 20 + dy * d, 5, 5 ); x = x + dx; y = y + dy; if( x<0 || x>width || y<0 || y>height ){ x = random( 10, width-10 ); y = random( 10, height-10 ); switch( int(random(4) ) ){ case 0: dx = 0; dy = 2; break; case 1: dx = 0; dy = -2; break; case 2: dx = 2; dy = 0; break; default: dx = -2; dy = 0; break; } } if( frameCount % 60 == 0 ) d = 1; if( frameCount % 60 == 40 ) d = -1; } }
最初のclass MonsterでMonsterという名前のクラスを宣言する。これで、Monsterはintやfloatと同じように扱える。ただし、
Monster m;
のように、Monster型の変数mを宣言するだけではなく、
m = new Monster();
のようにnewを使ってその実体(インスタンス)を構築しなければならない。 次のfloat x, y...;でクラスの属性(プロパティという)を定義している。これらの属性はクラスの実体ごとに割り当てられていて、mというMonster型のクラスのインスタンスのプロパティxはm.xとして表される。m.xはfloat型の変数と同様に読み書きできる。