【Scratch 3.0】アクションゲーム 自分がダメージを受けた場合【当たり判定】(Tips)

スポンサーリンク
アクションゲーム 自分がダメージを受けた場合【当たり判定】_m

前回までは、敵キャラクターにダメージを与えたときのアクションとアニメーションのプログラムをつくりました。

今回は逆にメインキャラクター(主人公)が敵キャラクターからダメージを受けたときのアクションとアニメーションのプログラムをつくっていきます。

この記事を読んでいただくと、アクションゲームで主人公が敵キャラクターからダメージを受ける方法とそれをアニメーション付きで動かすプログラミングの方法が分かります。

なお、以前の記事で紹介した「メインキャラクターのジャンプと着地」「敵キャラクターの追加とアニメーション」などのプログラムを組み込んでる箇所が出てきますが、その部分についてはこの記事では詳しく触れません。代わりに過去記事へのリンクを随時貼り付けたりしますので詳しくはそちらを参照してください。

また、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。

アクションゲームとは

アクションゲームとは、コンピューターゲームのジャンルの1つで、キャラクターをボタンやレバーなどで操作してステージを次々にクリアしたり、勝敗や得点を競うタイプのゲームのこと。反射神経と瞬間的な判断力を競うゲーム。

完成品

この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。

完成した動き

メインキャラクター(主人公)が敵キャラクターの攻撃を受けたら、ビックリ!したようなアニメーションが表示され、HPが1ずつ減っていきます。

主人公が回転している間はダメージを受けません(HPは減りません)。

HPが0になると主人公がダウンして、すべてのスプライトが動かなくなります。

主人公がダメージを受けたときの動きとアニメーションのみです。敵キャラクターにダメージを与えたときのパターンは過去の記事で説明しています。
アクションゲーム 自分がダメージを受けた場合【当たり判定】-完成-GIFアニメ

使用したスプライト

スプライトは「キャラ1」「地面1」「背景1」「天気1」「ブロック」「ティラノ」「プラント」「プテラ」の8つです。

アクションゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のprehistoric-platformer」を使っています。

「キャラ1・地面1・背景1・天気1」スプライトについては、こちらの記事の「使用したスプライト」の章で詳しく説明していますので参照してください。↓↓↓
【Scratch 3.0】アクションゲーム ジャンプと地面にめり込まないように着地する方法(Tips)

「ブロック」スプライトについてはこちら↓↓↓
【Scratch 3.0】アクションゲーム ブロックで足場や壁の作り方【当たり判定の方法】(Tips)

「ティラノ」「プラント」「プテラ」スプライトについてはそれぞれこちらの記事で解説しています。↓↓↓
【Scratch 3.0】アクションゲーム 敵キャラクターの追加とアニメーション①(Tips)
【Scratch 3.0】アクションゲーム 敵キャラクターの追加とアニメーション②(Tips)
【Scratch 3.0】アクションゲーム 敵キャラクターの追加とアニメーション③(Tips)

完成したスクリプト

完成したスクリプトの全体です。

内容を当たり判定に絞るため、すべてのスプライトのスクリプトから背景スクロールさせる部分などの説明に必須でないブロックは削除しています。

【キャラ1のスクリプト】

今回のテーマである「主人公がダメージを受ける」ために追加したブロックに赤枠をつけています。

赤枠以外の部分のスクリプトについては、以前に説明済みの内容ですのでこちらの記事でご確認ください。

変数
  • ジャンプ力:このスプライトのみ
  • 地面に触れた:このスプライトのみ
  • 側面がブロックに触れた:このスプライトのみ
  • 頭がブロックに触れた:このスプライトのみ
  • コスチューム保存用:このスプライトのみ
  • HP:このスプライトのみ

【地面1のスクリプト】

【背景1のスクリプト】

【天気1のスクリプト】

【ブロックのスクリプト】

変数
  • 壊れるブロック:このスプライトのみ

【ティラノのスクリプト】

今回のテーマである「主人公がダメージを受ける」ために追加したブロックに赤枠をつけています。

赤枠以外の部分のスクリプトについては、以前に説明済みの内容ですのでこちらの記事でご確認ください。

変数
  • アクション:このスプライトのみ

【プラントのスクリプト】

今回のテーマである「主人公がダメージを受ける」ために追加したブロックに赤枠をつけています。

赤枠以外の部分のスクリプトについては、以前に説明済みの内容ですのでこちらの記事でご確認ください。

変数
  • アクション:このスプライトのみ

【プテラのスクリプト】

今回のテーマである「主人公がダメージを受ける」ために追加したブロックに赤枠をつけています。

赤枠以外の部分のスクリプトについては、以前に説明済みの内容ですのでこちらの記事でご確認ください。

変数
  • アクション:このスプライトのみ
  • Y:このスプライトのみ

スクリプトの作り方

ここからはプログラムを作っていく中でポイントとなる部分を説明します。

今回のプログラムの主な仕様は、以下のようになります。

  1. 主人公(キャラ1)が敵キャラクター(ティラノ・プラント・プテラのいずれか)に触れたら「ヒット」アニメーションを表示し、HPを1減らす
  2. 主人公が下向き矢印キーを押している(回転している)間はダメージを受けない(HPも減らない)
  3. HPが0になったら、主人公は「ダウン」アニメーションを表示し動かなくなる(ゲーム続行不可)
  4. 主人公がダウンしたら、すべての敵キャラクターの動きを止める

ポイント①:敵に触れたときのプログラムを定義ブロックにまとめてつくる

敵に触れたときのプログラムを部品化するために定義ブロックのまとめてつくります。

これを組み込むことでで上手く動けばそのまま使いますし、上手く動かない部分があれば改良を考えます。(結果上手くいきましたので定義ブロックのまま使っています)

【キャラ1】のスクリプト

まず、条件としては「ティラノ・プラント・プテラ」の敵キャラクターのいずれかに触れたら「ヒット」アニメーションと「HPを-1ずつ変える」ブロックを組み入れます。

さらにここに「HPが0より大きい、かつ、下向き矢印キーが押されていない」という条件を加えることで主人公か(下向き矢印キーを押して)回転している間は「ヒット」アニメーションも実行されませんし、HPも減らなくなります。

つぎに、HPが0以下になったときに「ダウン」アニメーションを実行させます。

ちなみに「HPが0以下」を表すには以下の2つの方法がありますが、右のほうがシンプルなのでこちらを使っています。

さいごに「(敵キャラクターに触れた)でないまで待つ」というブロックを入れていますが、これは敵に1度触れたらHPは1だけ減るようにするためです。もし、これを入れない場合、敵に1度しか触れてなくてもHPが2,3減ってしまうことがあります。

つくった「敵に触れた」定義ブロックを入れる場所は、「緑の旗でスタート」ブロックで始まるスクリプトの「ずっと」ブロックの中です。

【キャラ1】のスクリプト

ポイント②:HPがなくなったら主人公はダウン・ゲーム続行できなくする

主人公がダウンしたときにゲームを続行できなくするには、動いているプログラムを止めれば良いです。

プログラムを止めるためには、赤丸ボタンを押した時と同じ効果がある「すべてを止める」ブロックと特定のプログラムを止める「このスクリプトを止める」ブロックと「スプライトの他のスクリプトを止める」が組み込まれているプログラム以外を止めるの3種類があります。

止める系のブロック
  • すべてを止める・・・すべてのスプライトや背景で動いているプログラムがすべて終了する
  • このスクリプトを止める・・・このブロックが呼び出されたスプライト・クローン・背景の一つのスクリプト(ブロックのかたまり)が止まる、他のスクリプトは動きつづける
  • スプライトの他のスクリプトを止める・・・同じスプライト内で動いているスクリプトの中で、このブロックが組み込まれているプロック以外のスクリプトが止まり、自身だけが実行され続ける、また別のスプライトや背景のプログラムには影響が無く動き続ける

止める系ブロックの中で「すべてを止める」がもっとも簡単で分かりやすいですが、これを使うと背景のクローンが消えてしまうので、それ以外のブロックを工夫して使います。(下図参照)

まず「スプライトの他のスクリプトを止める」ブロックで、これ以外のスクリプトを全部止めます。つぎに「このスクリプトを止める」ブロックで、自分自身のスクリプトを止めます。

こうすることで主人公(キャラ1スプライト)のプログラムは全部止まりますが、他のスプライトのプログラムはまだ止まっていません。

【キャラ1】のスクリプト

ポイント③:主人公がダウンしたらすべての敵の動きを止める

主人公がダウンしたので、つぎに敵のキャラクターの動きを止めます。(止めない方が良いと思う場合は、この部分はつくる必要はありません)

いずれの敵キャラクターにも同じブロックを組み込みます。

「ずっと」ブロックの中に「キャラ1のHPが0以下になったら」という条件で「スクリプトの他のスクリプトを止める」ブロックを実行します。

「このスクリプトを止める」ブロックを付け加えても良いですが、今回は特に影響ないので入れていません。(本当は追加してしっかり止めた方がメモリの節約になって良いです)

敵キャラクター(ティラノ・プラント・プテラ)のスクリプト

ここまでのポイントを押さえれば、アクションゲームで主人公が敵キャラクターからダメージを受ける方法とそれをアニメーション付きで動かすスクリプトを完成させることができると思います。

失敗しやすいポイント

プログラムのスリム化

主人公(キャラ1スプライト)のプログラムで下の図の部分ですが、「HP>0なら」という条件は2か所にあるので統合できないか試してみましょう。

HPは敵に触れたときに減るようにプログラムしているので、「敵に触れた」定義ブロックにまとめられれば効率的です。

【キャラ1】のスクリプト

実行した結果をみると、HPが0になると主人公は1度はダウンしますがすぐに立ち上がって復活してしまいました。これでは失敗です。

立ち上がった後に上矢印キーや左右矢印キーで動かせないため、他のスクリプトは確かに停止しています。しかし「待つ」定義ブロックのアニメーションは動いているため、「緑の旗でスタート」したブロックのかたまりは動き続けていることになります。

推測ですが、「スプライトの他のスクリプトを止める」ブロックは定義ブロックを含めてスクリプト全体を一体のものとみなしていて、逆に「このスクリプトを止める」ブロックは定義ブロックを個別のものとみなしているように見えます。

いまのところ明確な原因はよく分かりませんが、定義ブロックの中に止める系ブロックを入れる場合は注意が必要そうです。

アクションゲーム 自分がダメージを受けた場合【当たり判定】-失敗-GIFアニメ

試しに下の図の場所に移動させても結果は同じ状態になりました。

【キャラ1】のスクリプト

応用編

今回応用編はありません。

まとめ

さいごに、今回の記事で説明した『アクションゲームで主人公が敵キャラクターからダメージを受ける方法とそれをアニメーション付きで動かすプログラミング』のポイントをまとめます。

  • ポイント①:敵に触れたときのプログラムを定義ブロックにまとめてつくる
  • ポイント②:HPがなくなったら主人公はダウン・ゲーム続行できなくする
  • ポイント③:主人公がダウンしたらすべての敵の動きを止める

ここまで説明してきたアクションゲームのTipsを使えば、背景とそのスクロール・登場キャラクター・主人公と敵の当たり判定が出来ましたので、ゲームの基本的な骨格はできたものと思います。このあとは追加したい機能とか、改良したい点を修正していく段階になります。

どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)

この記事が『よかった/役に立った』と思ったら、左下のGoodボタンを押していただけると嬉しいです。

タイトルとURLをコピーしました