(このページに対する苦情等受け付けます)
Wikipedia先生は言った。「コンストラクタ(構築子、Constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数、メソッドのことである。」と。
まぁ、わかんないよね。
これはオレが最近よく使うプログラミングの技みたいなもので、まぁ基本なんだろうけど便利なんで解説します。(あ、Processingでのコンストラクタですよ。
じゃあまず、とりあえずこのzipファイル(constructor.zip)をDLして中のファイルのどれかをProcessingで開いてね。
constructor,Circle,Line,Quadってゆう4つのタブが開かれると思います。
これは、constructorってゆうタブが中心のコードです。
他の3つは、クラスって言うものです。
Processingでのプログラムは、
void setup() {
}
void draw() {
}
っていうコードが書かれてる所を中心に動きます。
クラスとか関数(void)って言われるものは、くっつけていく部品みたいなもんです。
じゃあ簡単に、Processingで円を書きたいとします。
難しくないです。文系も文系なオレが言うから間違いない。
void setup() {
size(400, 400); //横400,縦400の画面に設定
background(255); //背景は白
}
void draw() {
ellipse(width/2, height/2, 40, 40);
//ウィンドウの右端の座標(width)の半分のx座標,底の座標(height)の半分のy座標
//横と縦の直径
}
これで再生ボタンみたいな実行ボタンを押すと円が画面中央に表示されたはずですね。
これが第一歩です。
じゃあこれを動かしたい時、
ellipse(width/2, height/2,
この部分を変数に変えて、変数の値を徐々に増やすなり減らすなりすれば動きます。
具体的に言うと、
int x, y; //整数の変数を宣言(整数=少数点以下がない)
void setup() {
size(400, 400);
x = 0; y = 0;
}
void draw() {
background(255);
x++; y++;
ellipse(x, y, 40, 40);
}
これが一番簡単なサンプルです。
動かしてみると、斜めに円が進んで行きますよね。
この時ちょっと注意しときたいのが、draw()の中にbackgroundが入ってきてる事です。
アニメーションしたい時はdraw()に入れるのが普通です。
じゃないと背景が更新されなくて軌道が見え見えですね。
円を使ってアニメーションしたいならここまで来れば後はテキトーにやってれば色々できます。
じゃあこっから何が言いたいのか。
int x1, y1;
int x2, y2;
int x3, y3;
void setup() {
size(400, 400);
x1 = 0; y1 = 0;
x2 = 100; y2 = 100;
x3 = 300; y3 = 300;
}
void draw() {
background(255);
x1++; y1++;
x2++; y2++;
x3++; y3++;
ellipse(x1, y1, 40, 40);
ellipse(x2, y2, 40, 40);
ellipse(x3, y3, 40, 40);
}
3つの円を動かすために、合計6つの変数を定義して、初期化(最初の値を決めること)して、1ずつ動いていくってことを指定して。。あぁ面倒くさい。こっからこのページの本題に入ります。
こんな時に便利なのが今回紹介させて頂きますこのコンストラクタ!
なんと今まで収納に困っていたこれらのものをまとめちゃうことができちゃうんです!
え?ピンとこない?テンションがうざい?
仕方ないよ。そろそろ深夜2時だしね。
具体的にどうすることなのかっていうと、まぁ実際動かしてみた方が早いんだけど、
さっきと同じものを作るとすると、
Circle c1, c2, c3;
void setup() {
size(400, 400);
c1 = new Circle(0, 0, 20);
c2 = new Circle(100, 100, 20);
c3 = new Circle(300, 300, 20);
}
void draw() {
background(255);
c1.display(); c1.move();
c2.display(); c2.move();
c3.display(); c3.move();
}
class Circle{
int x, y, r;
Circle(int xpos, int ypos, int radius) {
x = xpos; y = ypos;
r = radius;
}
void move() {
x++; y++;
}
void display() {
ellipse(x, y, r*2, r*2);
}
}
この段階ではこっちを書く方が実感的にはめんどくさいね。
けど後でもうちょい楽になるから待ってね。
まずはこれがどうなってるかっていう解説をします。
int x, y, r;
Circle(int xpos, int ypos, int radius) {
x = xpos; y = ypos;
r = radius;
}
次にここ。c1 = new Circle(0, 0, 20);っていうコードになります。
x = xpos; y = ypos; r = radius;にある様に、xpos, ypos, radiusに突っ込まれた数字が、x, y, rに移されます。
void display() {
ellipse(x, y, r*2, r*2);
}
この部分です。c1.display();について解説します。
どんどん次行くよ。
c1.move();
って部分なんだけど
これは
void move() {
x++; y++;
}
って所をご覧ください。
xとyを1ずつ足すっていう処理をするための関数です。
これを、c1に限ってmoveするってことです(え
つまりc1のxとyに1ずつ足してくっていう命令を、c1.move();という風に
draw()の中に書くとmove()の中が実行されるんですよ。
動かしてみたらなんとなくわかるんじゃないかな。
これが一通りの流れです。
で、一番最初の
Circle c1, c2, c3;
で、この組み合わせを3つ宣言してるんです。
何個でも宣言できるよ。
けどこの書き方、ちょっとあんまり効率的じゃない。
さっきのプログラムを書き換えてみますね。
Circle[] c;
void setup() {
size(400, 400);
c = new Circle[3];
c[0] = new Circle(0, 0, 20);
c[1] = new Circle(100, 100, 20);
c[2] = new Circle(300, 300, 20);
}
void draw() {
background(255);
for(int i = 0; i < 3; i++) {
c[i].display(); c[i].move();
}
}
class Circle{
int x, y, r;
Circle(int xpos, int ypos, int radius) {
x = xpos; y = ypos;
r = radius;
}
void move() {
x++; y++;
}
void display() {
ellipse(x, y, r*2, r*2);
}
}
だいたいこんな感じかな。
ちょっとスマートになったはずです。
っていうのは、クラスって言うのは配列化することができるんです。
これで宣言の手間がさらに省けたってもんですね。
配列がわからない人は、んー。
さすがに配列の説明までするのはめんどくさいんだけど。。
int[] a = new int[10];って書くと、aっていう名前のついた整数を入れるための箱が、10個用意されます。
int a1, a2, a3, a4…a9;みたいに全部宣言せずに済むし、全部初期値が0で良いなら
void setup() {
int[] a = new int[10];
for(int i = 0; i < 10; i++) {
a[i] = 0;
}
}
ってすれば初期化もすごく楽に済むんだ。ここまででだいたいコンストラクタの使い方は終わり。
後は、コンストラクタの変数の使い方だけです。
例えば、さっきのプログラムでは、全部同じ方向に同じ速度で進んでたものを、
一個だけ速くしたいとか、遅くしたいとか、思った時。
どうすればいいか。
これもサンプルで説明します。
Circle[] c;
void setup() {
size(400, 400);
c = new Circle[3];
c[0] = new Circle(0, 0, 20);
c[1] = new Circle(100, 100, 20);
c[2] = new Circle(300, 300, 20);
}
void draw() {
background(255);
for(int i = 0; i < 3; i++) {
c[i].display();
}
c[0].move(); c[1].move();
c[2].x -= 2; c[2].y -= 3;
}
class Circle{
int x, y, r;
Circle(int xpos, int ypos, int radius) {
x = xpos; y = ypos;
r = radius;
}
void move() {
x++; y++;
}
void display() {
ellipse(x, y, r*2, r*2);
}
}
このプログラムでは、実行してもらえばわかりますが、一番下にある円が上に向かって逆走しています。
つまり、c[2]の円だけ逆走させているんです。
c[0].move(); c[1].move(); c[2].x -= 2; c[2].y -= 3;
に注目してもらえたらと思いますが、
c[0]とc[1]についてはmove()させています。
つまりx,yが1ずつ増えていく命令です。
問題はc[2]です。
c[2].xとあります。
ここがコンストラクタの一番便利な点だと思うんですが、
「宣言したクラスの名前.変数名」ってすると、「どのクラスのどの変数」という風に指名できるんです。
これを使って、
c[2].x -= 2;
つまり、c[2]のxだけを、-2する命令をしています。
これを応用すれば、色々なことができる様になりますよ。
自分が思いつきで書ける範囲は、ここまでですが、
自分よりもちゃんとプログラミング勉強した人とか、全然違うよとかあったらツッコミ入れてください。
やれる範囲で修正しま(めんど
す。←
プログラミング初めての人も、オレも3回生までプログラミングのプもやったことなかったから。
なんか作りたいモノがあればそのうちある程度出来るようになるんで、大丈夫やよ。
みんなで協力して頑張ろう。
back to 11_YoshidaY