3. プログラムを別々にする
Processingでフラッピーバード風ゲームをつくっていきます。
前回は下の土管の動きを作っていきました。 今回は前々回のプレイヤーの動きとがっちゃんこしていきます。
そのまえに
プレイヤーのプログラムコード
float x = 100;float y = 200;float speed = 0;void setup(){ size(600, 400);}void draw(){ background(0); speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}void mousePressed(){ speed = -10;}土管のプログラムコード
float dx = 400;float dy = 100;void setup(){ size(600, 400);}void draw(){ background(0); dx = dx - 5; if(dx + 50 < 0){ dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}この二つのプログラムコードが手元にある前提で話をすすめていきます。
3-1 プログラムをいっしょにする
プレイヤーの動きと、土管の動きが一緒になるように、 プログラムコードをがっちゃんこしていきます。
コピペでは動かない
まずはみんながやりそうなこと。
「二つのプログラムコードをそのままコピペする」
これは動きません。
// プレイヤーのプログラムコードfloat x = 100;float y = 200;float speed = 0;void setup(){ size(600, 400);}void draw(){ background(0); speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}void mousePressed(){ speed = -10;}// 土管のプログラムコードfloat dx = 400;float dy = 100;void setup(){ size(600, 400);}void draw(){ background(0); dx = dx - 5; if(dx + 50 < 0){ dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}エラーとなって全く動かないと思います。
なぜかというと、
「setupとdrawがそれぞれ二つ存在しているから」です。
setupとdrawは、プログラムコードの中に1つしか存在できません。
なので、setupの中だけ、drawの中だけ合わせると動きます。
setupの中身、drawの中身を一緒にする
// プレイヤーの変数float x = 100;float y = 200;float speed = 0;// 土管の変数float dx = 400;float dy = 100;void setup() { // プレイヤーのsetup size(600, 400); // 土管のsetup size(600, 400);}void draw() { // プレイヤーのdraw background(0); speed = speed + 1; y = y + speed; rect(x, y, 50, 50);
// 土管のdraw background(0); dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}void mousePressed() { speed = -10;}変数部分、setupの中、drawの中を切り出して、 部分部分で一緒にしました。
エラーはなくなり実行はできるようになりましたが、 プレイヤーが表示されません。
原因はいくつかあるのですが、
まずsetupの中身。
void setup() { // プレイヤーのsetup size(600, 400); // 土管のsetup size(600, 400);}size命令が2つ存在してしまっていておかしいので、1つにします。
次にdrawの中身。
void draw() { // プレイヤーのdraw background(0); speed = speed + 1; y = y + speed; rect(x, y, 50, 50);
// 土管のdraw background(0); dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}drawの途中、
プレイヤーのrect命令が終わったあとに、
background(0); が命令されています。
backgroundは塗りつぶす命令です。 backgroundの前に実行した、rect命令の四角形は塗りつぶされてしまったんですね。
なので、途中のbackground命令は無くします。
また、細かいのですが、
プレイヤーが土管の裏に表示されてしまうのを防ぐために、 プレイヤーのプログラムは、土管の命令の後に実行するようにします。
よって、下のようになります。
float x = 100;float y = 200;float speed = 0;float dx = 400;float dy = 100;void setup() { size(600, 400);}void draw() { background(0); // 土管のdraw dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);
// プレイヤーのdraw speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}void mousePressed() { speed = -10;}3-2 役割ごとに関数にする
drawの中の行が増えてきましたね。
void dokan(){ // 土管のdraw dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}void player(){ // プレイヤーのdraw speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}ぱっとみたときに、何をしているのかわかりづらくなってきてしまいました。
drawの中は、きれいにしておきたいので、 役割ごとにプログラムをわけたいと思います。
プログラムをわけるときに使うのが、 関数 です。
まず、下のプログラムを最後に追加します。
void dokan(){ // 土管のdraw dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}drawの中にあった土管のプログラムコードに、「dokan」という名前をつけてまとめたものです。
プレイヤーも同じように、名前をつけます。
void player(){ // プレイヤーのdraw speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}drawの中にあったプレイヤーのプログラムコードに、「player」という名前をつけてまとめたものです。
これらは「 関数 」と呼ばれ、簡単に言えば、プログラムをまとめて名前にすることができる機能です。
まとめたプログラムを呼び出すときは、
呼び出したい場所で、
「名前()」とすればOKです。
呼び出したい場所はもちろんdrawの中なので、 下のようにします。
void draw() { background(0); // まとめた土管のプログラムを呼び出す dokan(); // まとめたプレイヤーのプログラムを呼び出す player();}これでdrawの中がすっきりしましたね。
今後、プレイヤーに関するプログラムは、先ほどのまとめたplayer関数の中に、
土管に関するプログラムは、dokan関数の中に、プログラムしていきます。
ここまでのまとめたプログラムコードをこちらです。
float x = 100;float y = 200;float speed = 0;float dx = 400;float dy = 100;void setup() { size(600, 400);}void draw() { background(0); // まとめた土管のプログラムを呼び出す dokan(); // まとめたプレイヤーのプログラムを呼び出す player();}void mousePressed() { speed = -10;}void dokan(){ // 土管のdraw dx = dx - 5; if (dx + 50 < 0) { dx = 600; dy = random(200, 300); } rect(dx, dy, 50, 400 - dy);}void player(){ // プレイヤーのdraw speed = speed + 1; y = y + speed; rect(x, y, 50, 50);}