シューティングゲームでは、自機キャラクターの攻撃が敵に当たったときや敵の攻撃を受けたときに双方のキャラクターに何らかのアクション(イベント)が発生します。
プログラム上でこのようなイベントを検知する方法を当たり判定と言います。
前回の記事につづいて自機キャラクターが攻撃をして敵がダメージを受けたときの当たり判定の方法について説明します。今回は以前紹介した敵ボスにダメージを与えるパターンになります。
この記事を読んでいただくと、シューティングゲームで自機キャラクターが敵キャラクターにダメージを与えたときに当たり判定を行うスクリプトの作り方が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
スクリプトの作り方
完成した動き
自機キャラクターが打った弾丸が敵ボスに当たったときに当たり判定を行っています。
敵が弾丸に触れたときはダメージを受けたように機体を光らせ、さらに別のスプライトで用意した爆発のアニメーションを表示しています。
爆発のアニメーションは2種類あって、弾丸があたったときに1種類と敵ボスを倒したときに特別なアニメーションを使っています。
完成したスクリプト
使用したスプライトと完成したスクリプトの全体です。
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
【スプライト】
スプライトは「背景」「自機」「弾丸」「敵ボス」「敵ボスの弾」「爆発」の6つです。
シューティングゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のspace-shooter」を使っています。
【背景のスクリプト】
背景のスクリプトはありません。大きさを160%に拡大して使用しています。
【自機のスクリプト】
自機スプライトのプログラムは、こちらの記事のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 弾丸を連射する方法(Tips)
【弾丸のスクリプト】
弾丸スプライトのプログラムは、こちらの記事を流用して「敵にダメージを与えた」定義ブロックを追加しています。
- 爆発x:すべてのスプライト用
- 爆発y:すべてのスプライト用
【敵ボスのスクリプト】
敵ボススプライトのプログラムは、こちらの記事を流用して「敵ダメージ」定義ブロックを追加しています。
「HP」変数が0になると敵ボスを倒したことにするので、音声やアニメーションを使い分けています。
- 変数:このスプライトのみ
- HP:このスプライトのみ
【敵ボスの弾のスクリプト】
敵ボスの弾スプライトのプログラムは、こちらの記事のコピーなのでここでは省略します。↓↓↓
【Scratch 3.0】シューティングゲーム 敵(ボス)の攻撃をつくる方法⑤(Tips)
【爆発のスクリプトとコスチューム】
爆発スプライトは、弾丸スプライトのクローンから作成されます。
クローンが作られたら座標をその瞬間の弾丸クローンの座標に合わせて表示してアニメーションを開始するようになっています。
HPが0になると「ボス撃破メッセージ」を受け取って表示するアニメーションを分けています。
爆発アニメーションは、下の図のコスチューム1~6と7~14を使い分けています。
スクリプトの説明
プログラムを作っていく中でポイントとなる部分を説明します。(背景・自機・敵ボスの弾スプライトの説明は省略しますので、詳細は上に記載したリンク先の記事を参照ください)
重要なのは「何が何に触れたらどのスプライトに何をさせたいのか」を以下のように1つ1つ明確にすることです。
注意するのは、実際に動作を行うスプライトを主語にして読み替えることです。
これらを明確に出来たら1つ1つプログラムに組み込んでいきます。
- 弾丸が敵ボスに当たったとき、爆発音を鳴らす
→(読み替え)敵ボスが弾丸に触れたら爆発音を鳴らす、ただしHPが0と0以外で別々の音を鳴らす - 弾丸が敵ボスに当たったとき、爆発のアニメーションを発生させる
→爆発スプライトが弾丸が当たった位置に移動する、ただしHPが0のときは敵ボスの位置に移動する
→爆発スプライトがコスチュームを切り替えてアニメーション表示する、ただしHPが0のときは別のアニメーションを表示する - 弾丸が敵ボスに当たったとき、弾丸は消える
- 弾丸が敵に当たったとき、敵ボスの機体を光らせる、ただしHPが0のときは敵ボスを消す
→(読み替え)敵ボスが弾丸に触れたらコスチュームを切り替えてアニメーション表示する、ただしHPが0のときは消える
ポイント①:弾丸が敵ボスに当たったときのプログラムをつくる(爆発クローンのための座標を取得してクローン生成)
弾丸クローンが敵ボスに触れたときのプログラムは、「敵にダメージを与えた」定義ブロックにまとめてつくります。
弾丸クローンが敵ボスに触れたら2つのことを行います。1つ目は爆発スプライトのクローンを発生させること、2つ目は弾丸クローンを削除することです。
弾丸クローンの中で爆発クローンを発生させる理由は、敵ボスに触れた瞬間の弾丸のX座標とY座標が必要だからです。この座標をそれぞれ変数に格納しておいて、あとで爆発クローン側で読み取って利用します。
さいごに弾丸クローンを削除します。もし、ここで削除しない場合は弾丸が敵ボスを通過していきます。
ここで作った定義ブロックを弾丸クローンが移動中にいつでも実行されるように「(端に触れた)まで繰り返す」ブロックの中に配置します。
【弾丸のスクリプト】
「爆発x」と「爆発y」変数は「すべてのスプライト用」で作成しています。
ポイント②:敵ボスが弾を受けたときのプログラムをつくる(音と視覚効果を加える)
敵ボスが弾丸クローンに触れたときのプログラムは、「ボスダメージ」定義ブロックにまとめてつくります。
敵ボスが弾丸クローンに触れたら、HPが0より大きいか、または0以下でプログラムを分岐させています。
もしHPが0より大きかったら、「ボスダメージ」の音を鳴らす、HPを1つ減らす、ダメージを受けたような視覚効果を表現します。
一方でHPが0以下だったら「ボス撃破メッセージ」を送って、他のスクリプトを止める、「ボスやっつけた」の音を鳴らしす、スプライトを隠します。
【敵ボスのスクリプト】
この定義ブロックを敵ボスが動いている間中いつでも実行されるように下の図の3か所に配置します。
ポイント③:爆発アニメーションのプログラムをつくる
アニメーションは1つ1つのコスチュームをパラパラ漫画のように連続的に表示を切り替えることで表現しますので、あらかじめ画像を用意しておく必要があります。
今回は「スーパーパワーアセットパック」のエフェクト用の1枚の画像を等間隔に切って使用しています。今回は、いくつかある爆発エフェクト画像から2種類のアニメパターンの画像を使いました。
ポイント①で説明しましたが、弾丸が敵ボスに触れた瞬間の座標が変数の中に格納されているので、それを爆発クローンで取り出してその位置にクローンを移動させます。
一方で「ボス撃破メッセージ」を受け取ったときは、座標ではなく「(敵ボス)へ行く」ブロックを使っています。メッセージの送受信が実行されるタイミングが少し遅く、敵ボススプライトが座標を取得した時点の位置から移動してしまうため、このような方法で対処しました。
そのうえで、コスチュームをパラパラ漫画の要領でコスチュームを次々に変化させてアニメーションを完成させ、さいごにクローンを削除します。
【爆発のスクリプト】
ここまでのポイントを押さえてスクリプトを組むことが出来たら、シューティングゲームで自機キャラクターが敵キャラクターにダメージを与えたときに当たり判定を行うプログラムの完成です!
失敗しやすいポイント
もし複雑なプログラムに感じたら、最初は「爆発音なし」「爆発アニメーションなし」でつくると良いです。それが上手く出来てから他のプログラムを継ぎ足していくようにすると理解できると思います。
応用編
今回応用編は特にありません。
まとめ
さいごに、今回の記事で説明した『シューティングゲームで自機キャラクターが敵キャラクターにダメージを与えたときに当たり判定を行うスクリプトの作り方』のポイントをまとめます。
- ポイント①:弾丸が敵ボスに当たったときのプログラムをつくる(爆発クローンのための座標を取得してクローン生成)
- ポイント②:敵ボスが弾を受けたときのプログラムをつくる(音と視覚効果を加える)(HPによって処理を分岐)
- ポイント③:爆発アニメーションのプログラムをつくる(HPによって処理を分岐)
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)