前回の でんでんジャンプを作ろう 2 のつづきです。
完結まであと少しです。がんばりましょう。
ゲームは大まかに、企画・グラフィック・サウンド・プログラムの4つの要素で構成されています。これらをすべて一人で作るのは大変ですが、一人だからこそ味わえる楽しさもあります。
いつか誰かとコラボレーションしてみるのも、刺激があって楽しいものですよ。
ぜひ挑戦してみてください。
ゲームを改良しよう
ゲームとしての基本的な形はできあがりました。
ヘビを避けながらリンゴを取る、シンプルなゲームとして遊ぶことができます。
ここからは、少し手を加えて改良していきましょう。
まずは、ゲーム開始時に残りライフ数を表示するようにします。
これは、プレイヤーにあらかじめ伝えておくべき重要な情報だからです。
やられて初めて「ライフは3つなんだ」と気づくような設計は、あまり親切とは言えません。
情報 から ライフを3にする を 持ってきて 最初だけ の中に入れます。

次は、プレイヤーが好きなタイミングでゲームを開始できるようにしましょう。
ゲーム開始直後に操作しないと失敗してしまうような内容であれば、この仕組みはなるべく取り入れるべきです。
ゲーム から タイトル○を表示する を持ってきます。

最初だけ の中に入れて ヘビよけてリンゴをとれ に変更します。

開始前にメッセージが表示されるようになりました。
A ボタンを押すことでゲームが始まります。
本来はタイトルを表示するための機能ですが、このような使い方もOKです。

ゲームを難しくしよう
実際にゲームを遊んでみると、少し簡単すぎて「つまらない」と感じるかもしれません。
その主な原因の一つは、ヘビを避けることだけに集中していれば、ゲームオーバーにならずに済んでしまう点です。
これを解決する方法としては、たとえばヘビの動きを複雑にする、あるいはヘビ以外の敵キャラを登場させるといった工夫が考えられます。
ただし、今回はプログラムを複雑にしたくないので、「リンゴを取り損ねるとライフが減る」という仕様を追加することにします。
リンゴを取り損ねたことを判定するために、「スプライトが破棄されたかどうか」を調べるブロックを使用します。
リンゴは発射体として作られているため、画面の外へ出ようとすると自動的に破棄される仕組みになっています。
スプライト から下図のブロックを持ってきます。

リンゴのタイプは Food です。
Player から Food に変更します。

Food(リンゴ)が破棄されたときの演出も入れます。
スプライト から mySpriteにエフェクトスプレーをかける を持ってきます。
sprite にエフェクト崩壊を
かける 300 ミリ秒間 に変更します。

情報 から ライフを-1だけ増やす を追加します。

テストしてみましょう。
…おっと、バグが発生しました。リンゴを取ったときにライフが減ってしまいました。
これは、リンゴを取ったときと落としたときどちらもスプライトを破棄していることが原因です。
このバグを回避するため、リンゴを取った際にスプライトのタイプを変更するようにしましょう。
スプライト から mySpriteをPlayerタイプにする を持ってきます。

Player と Food の当たり判定の中に入れます。
mySprite を otherSprite に変更します。

新しいタイプを作ります。
メニューを開いて 新しいkindを追加 をクリックします。

新しく noFood というタイプを作ります。

これでプレイヤーがリンゴを取ったとき、Food から noFood に切り替わります。

テストしましょう。
リンゴを取ったときライフは減らなくなりました。
もう少し難しくしよう
少し遊んでみると、操作に慣れてしまい、まだ少し簡単すぎるように感じます。
プレイヤーが余裕を持って行動できる、つまり状況をしっかり把握できることが、簡単に感じる理由かもしれません。
リンゴの発生間隔を短くしてみます。
2000 から 1400 ミリ秒毎に変更します。

どうでしょうか、難しすぎますか?
私はこれくらいがいいかなと思います。
ゲーム難易度は遊んでもらいたい人に合わせて調整することがポイントです。
サウンドを入れよう
最後にサウンドを入れていきます。
音楽 から play sound ピコーン until done を持ってきます。

プレイヤーがリンゴを取ったときの効果音を入れます。
再生方法は バックグランドで に変更します。

つぎはジャンプしたとき、つまり A ボタンを押したときの中に入れます。
sound バンバン それから バックグランドで に変更します。

プレイヤーがヘビに当たったときと、リンゴを取り損ねたときに効果音を入れます。
sound zapped それから バックグランドで に変更します。

テストしましょう。
自分の好きなサウンドを選んでも楽しいですよ。
やられ演出を入れよう
ヘビに当たったときと、リンゴを取り損ねたときライフを失います。
いまはライフが減るだけなので、やられた感はないですね。
そこで画面を揺らしたいと思います。
シーン から カメラを4ピクセルで500ミリ秒間揺らす を持ってきます。

Player と Enemy(ヘビ) の当たり判定と、Food(リンゴ)が破棄されたときの中に入れます。

テストしてみましょう。
それぞれのタイミングで、画面が揺れているかを確認します。
ただし、揺れるのはスプライトとタイルマップの画像だけです。
背景は揺れないため、将来ほかのゲームを作る際、画面上のスプライトが少ないと揺れているかどうか分かりにくくなる場合があります。注意しましょう。
関数にしよう
これでゲームは完成です。
新しいテクニックを覚えたことで、作れるゲームのジャンルの幅も広がったのではないでしょうか。
ここで、もう一つ覚えておいてほしいことがあります。
それは「関数」の使い方です。
ここでいう関数(かんすう)とは、命令ブロックをひとまとめにして、何度も使いやすくする仕組みのことです。
高度なブロック を開き f(x) 関数 をクリックしてください。

関数を作成する をクリックします。

ヘビに当たったときやリンゴを取り損ねたときの処理がほぼ同じなので、これを関数にしたいと思います。
関数名を やられ処理 に変更して「完了」をクリックします。

ヘビとの当たり判定とリンゴの破棄イベントの近くに配置します。

効果音の再生とカメラの揺らし、ライフ−1を関数の中に移動します。
移動しなかった片方の処理はゴミ箱へ捨てましょう。
これで やられ処理 という関数ができました。

関数は呼び出すことで使えます。
関数 から 呼び出し やられ処理 を持ってきます。

当たり判定と破棄イベントの両方に 呼び出し やられ処理 を入れます。

テストしてみましょう。
関数を使っても、動作は関数を使う前とまったく同じです。
今回の例では、関数を使うメリットが少しわかりにくいかもしれません。
ですが、もしプレイヤーがやられるパターンが10個あったとしたらどうでしょう?
それぞれに「やられ処理」を毎回作るより、関数としてまとめておいて必要なときに呼び出す方がずっと簡単です。
実は関数には、もっと便利な使い方がたくさんあります。
プログラミングの世界では「関数を使うのが当たり前」と言われるほど、よく使われている機能です。
また別の機会に、くわしく説明したいと思います。