6. ゲームオーバー処理を作る
そのまえに
前回までのプログラムコード
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); } fill(255, 255, 255); rect(dx, dy, 50, 400 - dy); // 上の土管 fill(255); rect(dx, 0, 50, dy - 100);}void player() { speed = speed + 1; y = y + speed; fill(255, 255, 255);
// 下の土管と衝突しているか調べる int hit = isHit(x, y, 50, 50, dx, dy, 50, 400 - dy); if(hit == 1){ fill(255, 0, 0); } // 上の土管と衝突しているか調べる int hit02 = isHit(x, y, 50, 50, dx, 0, 50, dy - 100); if(hit02 == 1){ fill(255, 0, 0); } rect(x, y, 50, 50);}int isHit(float px, float py, float pw, float ph, float ex, float ey, float ew, float eh) { if (px < ex + ew && px + pw > ex) { if (py < ey + eh && py + ph > ey) { return 1; } } return 0;}6-1 死亡フラグを用意する
死亡フラグとはなにか
まずは「死亡フラグ」を用意しましょう。
死亡フラグという言葉を聞いたことがありますか?
「おれ、この戦いが終わったら結婚するんだ」 といった漫画のキャラクターは大抵、その戦いで亡くなったりしますよね。
亡くなってしまうキャラクターが言いがちなセリフを言ったとき、 「死亡フラグが立った」と言ったりします。
フラグとは、旗(はた)です。目印です。 フラグがたった、というのは、目印である旗がたった、ということです。
死亡フラグとは、死亡の目印と思ってもらえればよいでしょう。
目印である旗を普段はおろしておいて、 死んだら(土管に衝突したら)旗をあげてます。
プログラムは、旗がたっていればゲームを終了させて「ゲームオーバー」と表示させるというわけです。
目印のつくりかた
では、どのようにして目印をつくればよいでしょうか?
そう、これも変数です。
0か1、どちらかの数字が入る変数を用意しておきます。
int shibou = 0;
まだ死んでいませんので、0で旗を下ろしておきます。
死亡フラグをつくる
では、早速プログラムに死亡フラグを用意しましょう。
float x = 100;float y = 200;float speed = 0;float dx = 400;float dy = 100;int shibou = 0;void setup() { size(600, 400);}// ...省略します変数「shibou」を用意しました。
6-2 土管に衝突したら死亡フラグを立てる
次に衝突した時に、死亡フラグをたててみましょう。
死亡フラグをたてるということは、 変数「shibou」を0から1にするということです。
死亡フラグをたてるタイミングは、土管と衝突した時です。
すでに、衝突時にプレイヤーを赤くするプログラムを書いていました。 そこに付け加えましょう。
衝突時の判定は、player関数にプログラムしていましたね。
// ...省略void player() { speed = speed + 1; y = y + speed; fill(255, 255, 255);
// 下の土管と衝突しているか調べる int hit = isHit(x, y, 50, 50, dx, dy, 50, 400 - dy); if(hit == 1){ fill(255, 0, 0); // 死亡フラグをたてる shibou = 1; } // 上の土管と衝突しているか調べる int hit02 = isHit(x, y, 50, 50, dx, 0, 50, dy - 100); if(hit02 == 1){ fill(255, 0, 0); // 死亡フラグをたてる shibou = 1; } rect(x, y, 50, 50);}// ...省略死亡フラグを、if条件分岐の{と}のあいだに書いてあることに注意してください。
ifの外に書いてしまうと、衝突していなくても死亡フラグが立ってしまいますよ。
6-3 死亡フラグが立っていたらゲームをストップさせる
次に死亡フラグが立っていたら、 つまり変数「shibou」が1ならば、 ゲームをストップさせましょう。
ここでは、ゲームをストップさせるというよりは、 死亡フラグがたっていなければ、ゲームを進行させる、というようにプログラムしていきます。
死亡フラグが立っていなければ、 土管のプログラムであるdokan関数を、 プレイヤーのプログラムであるplayer関数を、 drawの中で実行させます。
void draw() { background(0);
// 死亡フラグがたっていなければ if(shibou == 0){ // 土管のプログラム dokan(); // プレイヤーのプログラム player(); }}土管と衝突すると、 死亡フラグがたって(shibouが1になって)、 dokan関数とplayer関数が呼ばれなくなり、 真っ黒な画面になります。
6-4 死亡フラグが立っていたらゲームオーバーの文字を表示させる
死亡フラグがたつと真っ暗な画面になるので、 ここでゲームオーバーを表示させましょう。
void draw() { background(0); // 死亡フラグがたっていなければ if(shibou == 0){ // 土管のプログラム dokan(); // プレイヤーのプログラム player(); } // 死亡フラグがたっていれば if(shibou == 1){ fill(255, 0, 0); textAlign(CENTER); text("GAME OVER", 300, 200); }}赤文字で「GAME OVER」が表示されるようになりました。
text("GAME OVER", 300, 200);
この命令は文字を表示する命令です。
text("表示したい文字", 横の位置, たての位置);
という命令で、 今回は画面の真ん中に表示したかったので、
横の位置を、画面の横幅600の半分の300に。 たての位置を、画面のたて幅400の半分の200にしました。
また、この場合だと「GAME OVER」の最初の文字「G」が画面の中央にくるようになってしまうので、
textAlign(CENTER);というおまじないをしてあげるとよい感じに中央になります。