消しました。Processingでフラッピーバードをつくろう(6):子供のプログラミング学習

<!--



# 6. ゲームオーバー処理を作る

## そのまえに
### 前回までのプログラムコード

```Java
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で旗を下ろしておきます。


### 死亡フラグをつくる

では、早速プログラムに死亡フラグを用意しましょう。

```Java
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関数にプログラムしていましたね。

```Java
// ...省略
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の中で実行させます。

```Java
void draw() {
  background(0);
  
  // 死亡フラグがたっていなければ
  if(shibou == 0){
    // 土管のプログラム
    dokan();
    // プレイヤーのプログラム
    player();
  }
}
```

土管と衝突すると、
死亡フラグがたって（shibouが1になって）、
dokan関数とplayer関数が呼ばれなくなり、
真っ黒な画面になります。


## 6-4 死亡フラグが立っていたらゲームオーバーの文字を表示させる

死亡フラグがたつと真っ暗な画面になるので、
ここでゲームオーバーを表示させましょう。

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



-->