7. スコア機能をつくる
そのまえに
前回までのプログラムコード
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 難易度の調整
難易度のことを考えずにプログラムしてきてしまったので、とても難しいゲームになってしまいました。
ゲーム自体が難しすぎてスコアを増やすことができないので、このあたりで難易度調整をしておきます。
難易度調整。最初の土管の位置を低くする。
最初の土管の位置が高すぎたので低くしておきます。
float dy = 200;難易度調整。上の土管と下の土管の隙間を大きくする
隙間が100だったので難しすぎました。
隙間を150にしましょう。
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);}表示を変更したら、当たり判定も変更しておきましょう。
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);}プレイヤーの上下のジャンプ速度の調整
まだまだ難しいと思う方は、上下のジャンプ速度を調整しても良いでしょう。 個人的には、難しすぎるくらいがフラッピーバードらしいので、この教材では落ちる速度の調整はしませんが、落ちる速度の調整方法も記載しておいます。
以下は例ですので、ご自分でやりやすいように調整すると良いでしょう。
void player() { // 下に落ちようとする重力を調整 speed = speed + 0.5; // ...省略}
void mousePressed() { // 上方向への力を調整 speed = -8;}7-2 スコア保存用の変数を用意する
スコアの型
スコアは1,2,3…と増えていきます。
1.1, 1.15, 2.35といった具合に、小数点では増えていきません。 なので、「 int型 」でスコア用の変数を用意します。
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してあげましょう。
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 スコアを前面に表示する
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という大きめのサイズにしています。