【Scratchで簡単なゲーム作成編⑦】ゲーム終了画面を実装する


※ 当ページには【広告/PR】を含む場合があります。
2020/10/19
【Scratchで簡単なゲーム作成編⑥】クローンの使い方を工夫して、スプライトのプログラミングを効率化してみる
【Scratchで簡単なゲーム作成編⑧】条件を満たした時のスプライトの進化状態を追加する

ゲームオーバーやエンディングなどの演出を機能として盛り込みたい場合、画面やゲームステージと違って走っているプログラムを止めることになります。

今回はゲームの終わらせ方をどう組み込むのか具体的なコーディング例をみて考えていきます。

ちなみに、今回の内容での
改造後のサンプルゲームは以下のようになります。


合同会社タコスキングダム|タコキンのPスクール【Pschool厳選】Scratchを学べるオンライン・駅前プログラミングスクール5選

エンディング画面を作る

ゲームプログラムが走っている途中でゲームを終了する際には、すべてを止めるブロックを呼び出すことになります。

よって、ゲーム終了自体はこのブロックを使うだけですので、とても単純なことです。

別の記事で色々な止め方のパターンを解説したように、ゲームオーバーやゲーム終了をいつ呼び出すかという工夫が今回の課題になってきます。

合同会社タコスキングダム|タコキンのPスクール
【Scratch入門〜中級編】スクリプトを止め方色々〜止め方を理解してゲームの中断・終了を理解する

Scratchで、ブロック内のスクリプトを止めたり再開したりする方法を深堀します。

まず初めに終了条件を考えて、設定しなくてはいけません。

例えば得点がある一定値以上になったときにエンディング画面になるようにしてみます。ゲームエンドの条件は以下に設定します。

            
            ゲームエンドの条件:
    スコアが100,000に達したとき
        
今回のプログラムは前回の内容の続きとして、このプログラムから改造していきます。

合同会社タコスキングダム|タコキンのPスクール
【Scratchで簡単なゲーム作成編⑥】クローンの使い方を工夫して、スプライトのプログラミングを効率化してみる

クローンの機能を上手く利用して、必要最低限のスプライトでゲームを作るテクニックを解説します。

ゲームの終了条件を、スプライトのどれか一つに持たせる必要があります。このゲームでいえば、ゲーム中ずっと走っている
たこスコアなどのスプライトがありますが、今回は得点を操作しているスコアスプライトに仕込むのが良いでしょう。

以下の図のように、初期化処理(
🚩が押されたとき)に、スコア > 99999まで処理を待ってから、エンディングイベントを送るように追加してみます。

合同会社タコスキングダム|タコキンのPスクール

次にエンディング用の背景を追加します。今回は演出など凝った工夫などは行いませんので無背景とします。背景の名前は
エンドに変えておきます。

合同会社タコスキングダム|タコキンのPスクール

簡単に
おわりの文字を下から上にエンドロールとして動かすためのおわりスプライトを追加します。

合同会社タコスキングダム|タコキンのPスクール

このスプライトは他のスクリプトからクローンされた場合に表示され、下から上にスーッと流れるようになります。

先程作った背景に戻って、背景のコードに以下を追加します。

合同会社タコスキングダム|タコキンのPスクール

スコアスプライトからエンディングイベントを受け取った時に、背景をエンドにしてから他のスプライトで走っているスクリプトは全て止めます。そして先程のおわりスプライトのクローンをここで作成し、エンドロールが流れきる4秒程度待ってからゲームを終了しています。

これだけだと、ゲーム中に止められたスクリプトは止まるのですが、スプライトは表示されたままになるので、エンディング画面に表示されては困るスプライトは
エンディングイベントを受け取った時に隠す、残ってしまったクローンはこのクローンを削除するを使って見えなくするようにします。

よって各関連スプライトにエンディングでは表示しない処理を以下のように施します。

合同会社タコスキングダム|タコキンのPスクール

これで簡単なエンディングを作ることができました。


合同会社タコスキングダム|タコキンのPスクール【Pschool厳選】Scratchを学べるオンライン・駅前プログラミングスクール5選

ゲームオーバーの状態を作る

もう一つの終了状態としてゲームオーバーの機能も追加してみます。

先ほどのゲームクリア条件とは別に、たこの体力ゲージを作成し、食べ物が食べられない時間が長いとお腹が空いて体力がだんだん下がっていくような機能をつけてみます。

ということで、ゲームオーバーの条件としては

            
            たこの体力がゼロになったらゲームオーバー
        
ということで以降でプログラミングしてみます。

体力ゲージの作成

たこの体力を表すゲージをスプライトで作っていきます。

以下のように
たいりょくという名前でスプライトを新規作成し、わくたいりょくの2つのコスチュームを描きます。

合同会社タコスキングダム|タコキンのPスクール

またこのスプライトではたこの体力を管理するために、新しく以下の3つの変数を追加します。

            
            + グローバル変数: たいりょく
    たこの体力を数値化したもの。
    0 ~ 10までの数
- ローカル変数: ばんごう_
    クローンの識別番号。
    10個のクローンで体力ゲージを作る。
- ローカル変数: たいりょくへんか_
    食べ物を食べたときに回復させる場合に使うフラグ。
    0で何もしない状態、1になったとき体力を1増やす。
        
では体力ゲージのブロックコード実装例は以下の図のようになります。

合同会社タコスキングダム|タコキンのPスクール

ポイントだけかいつまむと、まず図の①ではゲームスタート時の初期化処理になります。

先ほど挙げた3つの変数の初期値を与え、ゲージを表示させる座標にくるようにコスチュームを
わくにしたスプライトを表示しています。また今回はタイマーを使って体力の変化を行いますので、スタート時にタイマーをリセットしています。

②ではコスチュームを
たいりょくにしたクローンを使ってゲージを表現しています。変数たいりょくが満タンの10のときには10個のクローンを全て表示させ、体力がゼロになったときに全てのクローンが非表示になるようにしています。

なお、クローンの識別番号
ばんごう_を割り当てるテクニックは以前の記事で特集しています。

合同会社タコスキングダム|タコキンのPスクール
【Scratch入門〜中級編】少しだけ難しいスプライトのクローンの高度な利用法

Scratchの中級者向けのテクニックとして、クローンの特殊な使い方を解説します。

次に図の③の箇所ですが、ここがゲームオーバーかどうかを判断させる処理になっています。

今回はタイマーで5秒たったら、体力が1ずつ減っていきます。ゼロになった時点でゲームオーバーです。

ただし、食べ物を食べることで体力は1ずつ回復しますので、ゲームオーバーにならないようにするためには食べ物を与え続ける必要があります。

タイマーの使い方に関しては、
以前のこちらの記事も参考になりますので、タイマーに使い慣れていなければ一読ください。

合同会社タコスキングダム|タコキンのPスクール
【Scratch入門】タイマーの基本と使い方のポイント

Scratchプログラミングの「タイマー」の基本的な使い方を解説します。

最後に④の箇所で、
ゲームオーバーイベントを送ってゲームオーバーの処理に移行します。

この
たいりょくスプライトの各イベント処理は以下のようになります。

合同会社タコスキングダム|タコキンのPスクール

上の内容で述べたように、エンディングやゲームオーバーのときには全て隠れるようにしています。

また、
たべた○イベントでは、食べ物を食べたことを判別するフラグたいりょくへんか_を1にすることで、体力を1つ増やすことができるようになります。

ゲームオーバー時の非表示処理

ゲームオーバーの時に画面に表示されたまま残ってしまわないように、ゲームオーバーイベント時に余計なスプライト全てを隠す・クローンを削除する必要があります。

合同会社タコスキングダム|タコキンのPスクール

おわりスプライト

エンディング用のおわりスプライトに新しくゲームオーバーのコスチュームを追加します。

合同会社タコスキングダム|タコキンのPスクール

コスチュームを追加しただけではプログラムが
エンディングなのかゲームオーバーなのか区別がつきません。

終了処理の区別のためにローカル変数
おわりかた_を追加して、0の時にはエンディング、1の時にはゲームオーバーに割りあてて、それぞれ違う演出にしてみます。

合同会社タコスキングダム|タコキンのPスクール

これでこのゲームにエンディングとゲームオーバーの2つの機能を実装できたことになります。


合同会社タコスキングダム|タコキンのPスクール【Pschool厳選】Scratchを学べるオンライン・駅前プログラミングスクール5選

まとめ

今回は、ゲームの終わらせ方を実際の例を見ながら解説しました。

やはりエンディングやゲームオーバーがあることで、より一層ゲームらしくなったと思います。