コンテンツにスキップ

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);というおまじないをしてあげるとよい感じに中央になります。