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