シューティングゲームでは、自機キャラクターの攻撃が敵に当たったときや敵の攻撃を受けたときに双方のキャラクターに何らかのアクション(イベント)が発生します。
プログラム上でこのようなイベントを検知する方法を当たり判定と言います。
今回は、自機キャラクターのライフ(予備の機体)を用意しておき、自機キャラクターがやられてもライフが無くなるまではゲームを続けられるようにします。これも当たり判定を利用してライフをコントロールするプログラムを組みます。
このようなライフのことをプレイヤーストックと言います。
この記事を読んでいただくと、シューティングゲームでプレイヤーストック(自機キャラクターのライフ)を表現するスクリプトの作り方が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
スクリプトの作り方
完成した動き
ゲームをスタートすると、左下にライフが3機表示されます。
自機キャラクターがやられるとライフが1機ずつ減っていき、最後の機体がやられるとゲームオーバーになって消滅します。
完成したスクリプト
使用したスプライトと完成したスクリプトの全体です。
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
【スプライト】
スプライトは「背景」「自機」「敵機2」「敵の弾2」「ライフ」の5つです。
シューティングゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のspace-shooter」を使っています。
【背景のスクリプト】
背景のスクリプトは、大きさを160%に拡大して真ん中に配置します。ポイントは他のキャラクターが背景に隠れないように「最背面へ移動する」ブロックで一番奥に移動させておくことです。
【自機のスクリプト】
自機スプライトのプログラムは、こちらの記事内容を一部追加・修正してつくっています。↓↓↓
【Scratch 3.0】シューティングゲーム 当たり判定の方法(自機がダメージを受けた場合)(Tips)
【敵機2・敵の弾2のスクリプト】
敵機2スプライトと敵の弾2スプライトのプログラムは、こちらの記事内容のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 敵の攻撃をつくる方法②(Tips)
【ライフのスクリプト】
プログラムの流れを簡単に説明すると以下のようになっています。
- 「ライフ」リストに要素3個用意して中身をすべて1にする、同時にライフスプライトのクローンを3個並べる
- クローンは「ストック」変数によって、1~3の個別の値を持っている
- 「ライフを減らすメッセージ」を受けたったら、ライフの残数と一致する「ライフ」リストの要素数の値を0に置きかえ、0となった要素番号と一致する「ストック」変数の値を持っているクローンを削除する
- ライフ:すべてのスプライト用
- ストック:このスプライトのみ
- ライフ:すべてのスプライト用
スクリプトの説明
プログラムを作っていく中でポイントとなる部分を説明します。(背景・敵機2・敵の弾2スプライトの説明は省略しますので、詳細は上に記載したリンク先の記事を参照ください)
ポイント①:変数・リストの初期化とライフクローンの表示
ここではライフ(プレイヤーストックの残数)を表す「ライフ」変数と1つ1つのライフの状態(1:生きている、0:死んでいる)を表す「ライフ」リストの値を1で初期化して、ライフのクローンを作成します。
ライフのクローンは、「幽霊の効果を30にする」ブロックで少し薄くして背景が少しだけ透けて見えるようにして、X座標を30ずつ変化させながら3個のクローンをつくって並べています。
【ライフのスクリプト】
ここで重要なのは「ストック」変数の役割です。
この変数は「このスプライトのみ」で作成しているので、クローンをつくるとクローン1つ1つに別々の値を持たせることができます。
つまり、1つ目のクローンには変数に「1」が、2つ目のクローンには変数に「2」が入った状態でクローンを作ることができます。
また、クローンを作る直後に「ライフの(ストック)番目に1を挿入する」ブロックがあるので、結果的にクローンを作った順番とライフリストの要素番号は一致していることになります。
下の図のように「ストック」変数の値は、ライフクローンには左から順番に1から3までの数字を持っていて、ライフリストには要素番号が変数の値と一致している状態になります。
ポイント②:自機がやられた、でもライフが残っていたらライフを1つ消す、全部やられたらゲームオーバーにする
敵に触れたときに、ライフを減らすかゲームオーバーとするかを判定します。
ゲームスタート時に「ライフ」変数の値の初期値を3と設定していました。
「ライフ」変数の値が0より大きかったら、つまり1以上だったら残りのライフがまだあるので「(ライフを減らす)を送って待つ」を行い、送った先では変数の値と一致するライフリストの要素番号の値を0に変更します。
その処理が終わるのを待ってから「ライフ」変数の値を1減らします。
一方で、「ライフ」変数の値が0以下だったらゲームオーバーにします。
【自機のスクリプト】
ポイント③:リストと組み合わせてライフクローンを削除する
自機スプライトからライフを減らすためのメッセージが送られてきたら、ライフスプライト側の「(ライフを減らす)を受けとったとき」ブロックでメッセージを受け取って処理を始めます。
メッセージを受け取ったらときの「ライフ」変数の値によって処理を変えていますが、どの1~3のどの値が来ても、「ライフ」変数の値と一致する「ライフ」リストの要素番号の値を0に変えます(0:はクローンを削除することを表します)。
「ライフ」リストの値を変更したら、「ストック」変数の値と一致する「ライフ」リストの要素番号の値を見て、もし0だったらそのクローンを削除します。
【ライフのスクリプト】
たとえば「ライフ」変数の値が3のときに自機がやられると、「ライフ」リストの要素番号3の値が0に変更されてリストの中身は下の図のようになります。
つぎに「ストック」変数の値とリストの値が比較されて、もし0が入っている要素番号と同じ値をストック変数の中に持つクローンがいれば、そのクローンが削除されます。
ここまでのポイントを押さえてスクリプトを組むことが出来たら、シューティングゲームでプレイヤーストック(自機キャラクターのライフ)を表現するプログラムの完成です!
失敗しやすいポイント
「ストック」変数は、クローンごとに異なる値を持たせる必要があるので必ず「このスプライトのみ」でつくるようにしてください。
応用編
以前書いた記事「【Scratch 3.0】シューティングゲーム 体力ゲージをつくる方法(Tips)」と組み合わせて、体力ゲージが無くなるか、もしくは敵の機体にぶつかったらライフを減らすようにしてみました。また、ついでに最後に「GAME OVER」のロゴも加えました。
まとめ
さいごに、今回の記事で説明した『シューティングゲームでプレイヤーストック(自機キャラクターのライフ)を表現するスクリプトの作り方』のポイントをまとめます。
- ポイント①:変数・リストの初期化とライフクローンの表示
- ポイント②:自機がやられた、でもライフが残っていたらライフを1つ消す、全部やられたらゲームオーバーにする(「~を送って待つ」ブロックを使う)
- ポイント③:リストと組み合わせてライフクローンを削除する
今回使ったテクニックは、シューティングゲームに限らずアクションゲームなどにも応用可能です。
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)