シューティングゲームでは、自機キャラクターの攻撃が敵に当たったときや敵の攻撃を受けたときに双方のキャラクターに何らかのアクション(イベント)が発生します。
プログラム上でこのようなイベントを検知する方法を当たり判定と言います。
今回は自機キャラクターが敵から攻撃を受けたときの当たり判定の方法について説明します。
この記事を読んでいただくと、シューティングゲームで自機キャラクターが敵キャラクターからダメージを受けたときに当たり判定を行うスクリプトの作り方が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
スクリプトの作り方
完成した動き
敵キャラクターが打った弾丸に触れたときと敵キャラクターにぶつかったときに当たり判定を行っています。
敵の弾丸に触れたときはダメージを受けたように機体を光らせ、敵の機体にぶつかったときは一発で退場(ゲームオーバー)にしています。
完成したスクリプト
完成したスクリプトの全体です。スプライトは「背景」「自機」「敵機2」「敵の弾2」の4つです。
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
【スプライト】
シューティングゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のspace-shooter」を使っています。
【背景のスクリプト】
背景のスクリプトはありません。大きさを150%または160%に拡大して使用しています。
【自機のスクリプト】
ダメージを受けたときのプログラムを「ダメージ」定義ブロックにまとめています。その中で敵の弾に触れたときと敵の機体に触れたときとで条件を分けて処理を行っています。
【敵機2のスクリプト・敵の弾2のスクリプト】
今回登場している敵キャラクターと敵の弾丸のプログラムの作り方は、こちらの記事の内容を流用していますのでここでは省略します。↓↓↓
スクリプトの説明
プログラムを作っていく中でポイントとなる部分を説明します。(背景・敵機2・敵の弾2スプライトの説明は省略しますので、詳細は上に記載したリンク先の記事を参照ください)
ポイント①:敵の弾に当たったときのプログラムをつくる(「ダメージ」定義ブロック)
「ダメージ」定義ブロックに「もし(敵の弾2に触れた)なら」ブロックをつなげて作ります。
「敵の弾2」に触れたとき、音を鳴らしたあと、画像効果の「明るさを100%→明るさを0%」を2回繰り返しています。
こうすることでスプライトが点滅したような効果を得ることができます。この方法は、わざわざ白いコスチュームを用意する必要がないので便利です。
【自機のスクリプト】
ポイント②:敵の機体に触れたときのプログラムをつくる(「ダメージ」定義ブロック)
同じように「ダメージ」定義ブロックに「もし(敵機2に触れた)なら」ブロックをつなげて作ります。
ここでは直接スクリプトを組むのではなく「ゲームオーバー」メッセージを送って、プログラムを分けて作っています。
この辺は他のプログラムとの関係や好みに応じて作っても問題ありませんが、もし他のスプライトのプログラムの中でゲームオーバーを発生させる必要が出てきた場合は「メッセージを送る」形にしておく必要があります。
「ゲームオーバー」を受け取ったとき、自機スプライトの他のスクリプト(緑の旗でスタートしたプログラム部分)を停止して音を鳴らしたあと、画像効果の「明るさを80%→明るさを0%」を2回繰り返して、最後にスプライトを「隠す」ブロックで画面から消しています。
【自機のスクリプト】
ポイント③:「ダメージ」定義ブロックを適切な位置に配置する
「ダメージ」定義ブロックが完成したら、それを「ずっと」ブロックの中に配置する必要があります。
このとき、「もし○○なら」ブロックの外だけ(下の図でいうと一番下)に配置した場合は自機スプライトが停止している時にしか動作しません。そのため、上下左右に移動中にダメージを受けたとしても定義ブロックは動作しないことに注意しましょう。
つまり、「上下左右キー」または「WSADキー」のいずれかのキーが押されている間にダメージを受けたときも定義ブロックが動作するように下の図のように5か所に配置する必要があります。
【自機のスクリプト】
ここまでのポイントを押さえてスクリプトを組むことが出来たら、シューティングゲームで自機キャラクターが敵キャラクターからダメージを受けたときに当たり判定を行うプログラムの完成です!
失敗しやすいポイント
上で説明したようにダメージを受けたときのプログラムは1か所に配置するだけでは不十分です。
プログラムは「もし○○なら」ブロックで処理が分かれている箇所が少なからずあるものなので、あとから作ったプログラムの部品については、そのように分岐した処理の中にも必要かどうかは必ず確認するようにしましょう。
応用編
過去記事で登場した敵キャラクター5機をすべて登場させて、すべての敵の攻撃に対して当たり判定を組み込んでみました。
過去の敵キャラクターの攻撃パターンはこちらの記事で詳しく説明しています。↓↓↓
【Scratch 3.0】シューティングゲーム 敵の攻撃をつくる方法①(Tips)
【Scratch 3.0】シューティングゲーム 敵の攻撃をつくる方法②(Tips)
【Scratch 3.0】シューティングゲーム 敵の攻撃をつくる方法③(Tips)
【Scratch 3.0】シューティングゲーム 敵の攻撃をつくる方法④(Tips)
【Scratch 3.0】シューティングゲーム 敵(ボス)の攻撃をつくる方法⑤(Tips)
まとめ
さいごに、今回の記事で説明した『シューティングゲームで自機キャラクターが敵キャラクターからダメージを受けたときの当たり判定を行うスクリプトの作り方』のポイントをまとめます。
- ポイント①:敵の弾に当たったときのプログラムをつくる(「ダメージ」定義ブロック)
- ポイント②:敵の機体に触れたときのプログラムをつくる(「ダメージ」定義ブロック)
- ポイント③:「ダメージ」定義ブロックを適切な位置に配置する(合計5か所)
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)