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

<!--

# 7. スコア機能をつくる
## そのまえに
### 前回までのプログラムコード

```Java
float x = 100;
float y = 200;
float speed = 0;
float dx = 400;
float dy = 100;
int shibou = 0;
void setup() {
  size(600, 400);
}
void draw() {
  background(0);
  // 死亡フラグがたっていなければ
  if(shibou == 0){
    // 土管のプログラム
    dokan();
    // プレイヤーのプログラム
    player();
  }
  // 死亡フラグがたっていれば
  if(shibou == 1){
    fill(255, 0, 0);
    textAlign(CENTER);
    text("GAME OVER", 300, 200); 
  }
}
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);
    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);
}
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;
}

```

## 7-1 難易度の調整

難易度のことを考えずにプログラムしてきてしまったので、とても難しいゲームになってしまいました。
ゲーム自体が難しすぎてスコアを増やすことができないので、このあたりで難易度調整をしておきます。

### 難易度調整。最初の土管の位置を低くする。
最初の土管の位置が高すぎたので低くしておきます。

```Java
float dy = 200;
```

### 難易度調整。上の土管と下の土管の隙間を大きくする
隙間が100だったので難しすぎました。
隙間を150にしましょう。

```Java
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);
  // 隙間を150に変更
  rect(dx, 0, 50, dy - 150);
}
```

表示を変更したら、当たり判定も変更しておきましょう。

```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;
  }
  // 隙間を150に変更した当たり判定
  int hit02 = isHit(x, y, 50, 50, dx, 0, 50, dy - 150);
  if(hit02 == 1){
    fill(255, 0, 0); 
    shibou = 1;
  }
  rect(x, y, 50, 50);
}
```

### プレイヤーの上下のジャンプ速度の調整

まだまだ難しいと思う方は、上下のジャンプ速度を調整しても良いでしょう。
個人的には、難しすぎるくらいがフラッピーバードらしいので、この教材では落ちる速度の調整はしませんが、落ちる速度の調整方法も記載しておいます。


以下は例ですので、ご自分でやりやすいように調整すると良いでしょう。

```Java
void player() {
  // 下に落ちようとする重力を調整
  speed = speed + 0.5;
  // ...省略
}

void mousePressed() {
  // 上方向への力を調整
  speed = -8;
}

```


## 7-2 スコア保存用の変数を用意する
### スコアの型
スコアは1,2,3...と増えていきます。
1.1, 1.15, 2.35といった具合に、小数点では増えていきません。
なので、「**int型**」でスコア用の変数を用意します。

```Java
float x = 100;
float y = 200;
float speed = 0;
float dx = 400;
float dy = 100;
int shibou = 0;
// スコア用の変数
int score = 0;
```

## 7-3 土管が画面の端までいったらスコアを増やす
### いつスコアを増やすか
プレイヤーが土管を通り過ぎたらスコアをプラス1したいので、
ここでは土管が画面の左端まで到達したときに、スコアをプラス1してあげましょう。

```Java
void dokan() {
  // 土管のdraw
  dx = dx - 5;
  if (dx + 50 < 0) {
    dx = 600;
    dy = random(200, 300);
    score = score + 1;
  }
  fill(255, 255, 255);
  rect(dx, dy, 50, 400 - dy);
  // 上の土管
  fill(255);
  rect(dx, 0, 50, dy - 100);
}
```


## 7-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); 
  }
  // スコアを表示
  fill(255);
  textAlign(CENTER);
  textSize(48);
  text(score, width/2, 100);
}
```

### 文字の大きさ
「**textSize(48)**」という命令を使うことで、文字の大きさを調整できます。
ここではスコアを大きく表示したかったので、48という大きめのサイズにしています。

-->