シューティングゲームでは、自機キャラクターの攻撃が敵に当たったときや敵の攻撃を受けたときに双方のキャラクターに何らかのアクション(イベント)が発生します。
プログラム上でこのようなイベントを検知する方法を当たり判定と言います。
今回は、当たり判定を利用して自機キャラクターの攻撃が敵に当たったときに得点をカウントアップさせる方法について紹介します。得点は変数そのものではなく数字のロゴ(スプライト)で表現します。
この記事を読んでいただくと、シューティングゲームで敵をやっつけたときに得点アップを表示する得点カウンタをスプライトを使って表現するスクリプトの作り方が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
スクリプトの作り方
完成した動き
ステージ右上に8ケタの得点カウンタを表示しています。
自機キャラクターの弾丸が敵に当たると100点ずつアップしていきます。
完成したスクリプト
使用したスプライトと完成したスクリプトの全体です。
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
【スプライト】
スプライトは「背景」「自機」「弾丸」「敵機1」「爆発」「得点カウンタ」の6つです。
シューティングゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のspace-shooter」を使っています。
【背景のスクリプト】
背景のスクリプトは、大きさを160%に拡大して真ん中に配置します。ポイントは他のキャラクターが背景に隠れないように「最背面へ移動する」ブロックで一番奥に移動させておくことです。
【自機のスクリプト】
自機スプライトのプログラムは、こちらの記事内容のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 弾丸を連射する方法(Tips)
【弾丸のスクリプト】
弾丸スプライトのプログラムは、こちらの記事内容のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 当たり判定の方法(敵にダメージを与えた場合①)(Tips)
【敵機1のスクリプト】
敵機1スプライトのプログラムは、こちらの記事内容を一部追加してつくっています。↓↓↓
【Scratch 3.0】シューティングゲーム 当たり判定の方法(敵にダメージを与えた場合①)(Tips)
追加したプログラムは、敵機1にダメージを与えたら「得点」変数の値を100点ずつプラスして、「得点メッセージを送る」ブロックの部分です(下図赤枠)。
【爆発のスクリプト】
爆発スプライトのプログラムは、こちらの記事内容のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 当たり判定の方法(敵にダメージを与えた場合①)(Tips)
【得点カウンタのスクリプト】
プログラムの流れを簡単に説明すると以下のようになっています。
- 得点リストに要素8個用意して中身をすべて0にする、同時に0のコスチュームを8個並べる
- 「得点メッセージ」を受けとったら、得点変数の値を1ケタずつ得点リストに格納する(1の位の数字は1番目の要素に、10の位の数字は2番目の要素に)
- 得点リストに入っている1番目の要素から8番目の要素まで順番に数字を読み取って、その数字と一致したコスチュームを選択する(するとコスチュームが差し替えられる)
「得点の桁」変数は「このスプライトのみ」で、「得点」変数は「すべてのスプライト用」で作成します。
その他の変数「m」「n」は今回は「すべてのスプライト用」で作成しましたが、「このスプライトのみ」で作成しても良いです。
また「得点」リストを「すべてのスプライト用」で作成します。
- 得点:すべてのスプライト用
- 得点の桁:このスプライトのみ
- m:すべてのスプライト用 or このスプライトのみ
- n:すべてのスプライト用 or このスプライトのみ
- 得点:すべてのスプライト用
スクリプトの説明
プログラムを作っていく中でポイントとなる部分を説明します。(背景・自機・弾丸・爆発スプライトの説明は省略しますので、詳細は上に記載したリンク先の記事を参照ください)
ポイント①:得点カウンタ用のコスチューム(数字ロゴ)を用意する
「得点カウンタ」スプライトには、0~9の数字の形をしたロゴをコスチュームとして用意します。
得点を表す数字ロゴには、スーパーパワーアセットパックの「Space Shooter」に用意されている「font-20×20.png」ファイルを使用しています。
これは20×20ピクセルサイズの英数字や記号のロゴが横15文字・縦8文字分が一枚の画像ファイルに詰め込まれているので、「PL_ImageConstructor.exe(Windows用フリーソフト)」のような画像編集ソフトを使って縦横等間隔に分割して使用します。
分割したロゴのうち、0~9の数字ロゴのみ使用します。
下の図のようにロゴの数字とコスチュームの名称は一致させておきます。
ポイント②:敵にダメージを与えたら得点をアップして数字ロゴを差し替えるためのメッセージを送る
敵機1スプライトのダメージを受けたときに動作する「敵ダメージ」定義ブロックの中に、得点用カウンタを処理するブロックを追加しています。
「(得点)変数を100ずつ変える」ブロックで、変数の中身を100点ずつアップさせています。
また、「得点メッセージを送る」ブロックで置いています。これはあとで説明しますが、「得点カウンタ」スプライト側でメッセージを受け取って、得点用カウンタの数字ロゴを差し替える処理を行っています。
【敵機1のスクリプト】
ポイント③:得点を入れるリストと数字ロゴを初期化する
ここでは8ケタの得点カウンタと各ケタの数字を表す「得点」リストの8個の要素の中身をいずれも0で初期化します。
得点カウンタについては、コスチュームを0にしてX座標を-20ずつ変化させながら8個のクローンをつくって並べます。
得点リストについては、要素番号1から8に数字の0を格納しています。
この時に重要なのは「得点の桁」変数の役割です。
この変数は「このスプライトのみ」で作成しているので、クローンをつくるとクローン1つ1つに別々の値を持たせることができます。
つまり、1つ目のクローンには変数に「1」が、2つ目のクローンには変数に「2」が入った状態でクローンを作ることができます。
また、クローンを作る直前に「(得点の桁)番目に0を挿入する」ブロックがあるので、結果的にクローンを作った順番と得点リストの要素番号は一致していることになります。
【得点カウンタのスクリプト】
下の図のように「得点の桁」変数の値は、得点カウンタの場合は右から順番に1から8までの数字が格納されており、得点リストには要素番号が変数の値と一致している状態になります。
ポイント④:敵を倒したら得点が入っているリストを更新する
敵機1が倒されたら「敵機1」スプライトから「得点メッセージ」が送られてきます。それを「得点カウンタ」スプライト側で受け取ってスクリプトを開始します。
2つの定義ブロック「リストに得点をセット」と「数字コスチュームを並べる」に分けていますが、ここでは前者の「リストに得点をセット」について説明します。
「リストに得点をセット」定義ブロックのプログラムは、大きく分けて2つの処理を行っています。
1つは「得点」変数の値を1ケタずつ読み取ってリストに格納する処理、もう1つは変数の値がない桁数については0を格納する処理です。
「得点」変数の値を1ケタずつ読み取ってリストに格納する処理では、1の位の数字はリストの1番目の要素に、10の位の数字はリストの2番目の要素に、という具合に入れていきます。
【得点カウンタのスクリプト】
たとえば「得点」変数の値が「13700」だった場合、「得点」リストの中身は下の図のように格納されます。
※「得点」リストは、複数のスプライトで読み書きするので「すべてのスプライト用」で作っておく必要があります。
ポイント⑤:得点リストを読み取って数字ロゴを差し替える
ここでは残りの定義ブロック「数字コスチュームを並べる」と「数字コスチューム選択」について説明します。
【得点カウンタのスクリプト】
「数字コスチュームを並べる」定義ブロックの役割は、それぞれの桁を区別して数字ロゴを選択することです。
「得点の桁」変数には、得点カウンタの8ケタのクローンが各ケタごとに1~8の別々の値を持っているので区別することができるようになっています。
つぎに「数字コスチューム選択」定義ブロックは、上の「数字コスチュームを並べる」定義ブロックと合わせて見る必要がありますが、「得点の桁」変数に入っている値と同じ値を持つ要素番号を「得点」リストから探し出して値を取得します。
その値が1ならコスチューム名を1にし、その値が2ならコスチューム名を2に変更する処理を行っています。
ここまでのポイントを押さえてスクリプトを組むことが出来たら、シューティングゲームで敵をやっつけたときに得点アップを表示する得点カウンタをスプライトを使って表現するプログラムの完成です!
少々複雑でしたが、クローンを1つ1つ識別するためには「このスプライトのみ」で変数を作って別々の値を持たせる必要があり、それらの値を他のスプライトで読み取るにはリストを介して行う方法が便利だと思います。
失敗しやすいポイント
今回、「このスプライトのみ」で作った「得点の桁」変数をつかって、クローンごとに別々の値を持たせて識別する方法で得点カウンタを表現しました。
もし、この変数を「すべてのスプライト用」で作ってしまうとクローンが識別できなくなってしまうので上手くいきません。
そのような間違いをしてしまったとき、どのような動きになるのかは以前の記事で詳しく説明しているので参考にしてみてください。↓↓↓
応用編
今回応用編は特にありません。
まとめ
さいごに、今回の記事で説明した『シューティングゲームで敵をやっつけたときに得点アップを表示する得点カウンタをスプライトを使って表現するスクリプトの作り方』のポイントをまとめます。
- ポイント①:得点カウンタ用のコスチューム(数字ロゴ)を用意する
- ポイント②:敵にダメージを与えたら得点をアップして数字ロゴを差し替えるためのメッセージを送る
- ポイント③:得点を入れるリストと数字ロゴを初期化する
- ポイント④:敵を倒したら得点が入っているリストを更新する
- ポイント⑤:得点リストを読み取って数字ロゴを差し替える
今回使ったテクニックは、シューティングゲームに限らずどのようなゲームでも応用可能です。
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)