今回は、アクションゲームでよく使われるライフ(プレイヤーストック)を表現するプログラムをつくってみます。
以前の記事では、敵から受けたダメージをHPゲージで表現するプログラムを紹介しましたが、ライフが使われる場面の方がメジャーかもしれません。
この記事を読んでいただくと、アクションゲームでライフ(プレイヤーストック)を表現するプログラミングの方法が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
完成品
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
完成した動き
プログラムをスタートさせるとステージ左下に主人公(メインキャラクター)の形をした3体の小さなライフ(プレイヤーストック)が表示されます。
主人公が敵キャラクターの攻撃を受けるとライフが1体ずつ減っていきます。
最後の1体が敵の攻撃を受けると主人公がダウンして、すべてのスプライトが動かなくなります。
使用したスプライト
スプライトは「キャラ1」「地面1」「背景1」「天気1」「ティラノ」「ライフ」の6つです。
アクションゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のprehistoric-platformer」を使っています。
「キャラ1・地面1・背景1・天気1」スプライトについては、こちらの記事の「使用したスプライト」の章で詳しく説明していますので参照してください。↓↓↓
【Scratch 3.0】アクションゲーム ジャンプと地面にめり込まないように着地する方法(Tips)
「ティラノ」スプライトについてはこちらの記事で解説しています。↓↓↓
【Scratch 3.0】アクションゲーム 敵キャラクターの追加とアニメーション①(Tips)
【ライフのスプライト】
「ライフ」のスプライトは「キャラ1」と同じものを使うので、「キャラ1」スプライトをコピー(複製)してスプライトの名前を「ライフ」と変更します。
プログラムは新しく作るので、複製されたプログラムがある場合はすべて削除します。
また、コスチュームは残しておいても良いですが、ライフに使うものだけ残してあとは削除してOKです。
完成したスクリプト
完成したスクリプトの全体です。
内容をライフ(プレイヤーストック)に関するものに絞るため、すべてのスプライトのスクリプトから背景スクロールや一部のアニメーションなどの説明に必須でないブロックは削除しています。そのため、以前の記事に比べてプログラムの量が少なくなっているところがあります。
【キャラ1のスクリプト】
今回のテーマである「ライフ(プレイヤーストック)」のために追加したブロックに赤枠をつけています。
【地面1のスクリプト】
【背景1のスクリプト】
【天気1のスクリプト】
【ティラノのスクリプト】
今回のテーマである「ライフ(プレイヤーストック)」のために追加したブロックに赤枠をつけています。
「ティラノ」スクリプトの基本的な動きについてはこちらの記事で解説済みですので興味があれば参照ください。
- アクション:このスプライトのみ
【ライフのスクリプト】
- ライフ:このスプライトのみ
- ストック:このスプライトのみ
スクリプトの作り方
ここからはプログラムを作っていく中でポイントとなる部分を説明します。
ポイント①:ライフのクローンに番号をつける
まず「ライフ」のクローンを3体つくります。
下の図のスクリプトで「このスプライトのみ」で作った変数を2つ使っていますが、それぞれの意味を明確にしておきます。
- 「ストック」変数:ライフの残りの数
- 「ライフ」変数:クローンごとに付けた1~3の番号
「ストック」変数はライフの残数を表すので初期値を3にします。
そして、クローンをつくる手前で「ライフを1ずつ変える」ブロックを置いているので、作られたクローンが持っている「ライフ」変数にはそれぞれ順番に「1」~「3」の別々の値を持った状態になります。
下の図のようにクローンごとに「ライフ」変数に持っている値が異なった状態をつくることができます。これによってクローンを1つ1つ識別できるようになります。
ポイント②:ライフを1体ずつ順番に減らす
ライフを減らすタイミングは、「キャラ1」のスクリプトに追加した「(ライフを減らす)を送って待つ」ブロックが担っていて、そのメッセージを「ライフ」スプライト側で受け取ってスクリプトが動き出します。
たとえば、ライフがまだ3体すべて残っているとき、「ストック」変数の値は「3」なので「もし(ストック=3)なら」の条件が成立します。
つぎに「もし(ライフ=3)なら」ブロックの条件ですが、これは『ライフ変数の値が3のクローンを探す』ことと同じ意味になります。つまり、「ライフ」変数の値が「3」のクローンが削除されます。
最後に「ストック」変数から1を減らします。
その次は「もし(ストック=2)なら」ブロックの条件が成立するので、「ライフ」変数の値が「2」のクローンが削除される、という流れになっています。
ちなみに以前「シューティングゲームのTips記事」でも同じようにライフ(プレイヤーストック)を表現するプログラムを紹介しました。↓↓↓
こちらではリストを介した方法になっています。クローンがたくさんある場合はリストを使ったこちらの方法の方がすっきりしたプログラムになると思うので参考にしてみてください。
ポイント③:ライフが無くなったらプログラムを止める
『ライフが無くなったら』という条件を「ストック」変数をつかってどのように表すかを考えます。
「ストック」変数の値が「0」のときはどのような状態かというと、ステージ上からライフは全部使い切った状態です。
ただし、最後のライフがまさに敵と戦っている状態なので、このタイミング(ストック=0)ですぐにゲームオーバーするわけにはいきません。
この最後の主人公が敵にやられたときがゲームオーバー、つまりすべてのスプライトを停止させるタイミングになります。
ということで「もし(ライフのストック<0)なら」ブロックを条件にしています。
そして、「すべてを止める」ブロックではなくて「スプライトの他のスクリプトを止める」と「このスクリプトを止める」の2つのブロックを使っていることにも意味があります。
「すべてを止める」ブロックを使うとクローンが画面上から消えてしまうため、私はあまり使用しません。
今回のプログラムでは、「地面1」「背景1」「天気1」スプライトをクローンで作っているので「すべてを止める」ブロックが動いた瞬間に画面上から消えてしまいます。
そのため、ブロックを配置する必要がある点だけは少し面倒ですが、止めたいスプライトごとに「スプライトの他のスクリプトを止める」ブロックと「このスクリプトを止める」ブロックをセットで組み込むようにしています。
同じように「ティラノ」のスクリプトにも下の図のように組み込んでいます。
ここまでのポイントを押さえれば、アクションゲームでライフ(プレイヤーストック)を表現するスクリプトを完成させることができると思います。
失敗しやすいポイント
失敗しやすいポイントは特にありません。
応用編
今回応用編は特にありません。
まとめ
さいごに、今回の記事で説明した『アクションゲームでライフ(プレイヤーストック)を表現するプログラミング』のポイントをまとめます。
- ポイント①:ライフのクローンに番号をつける(変数を「このスプライトのみ」でつくる)
- ポイント②:ライフを1体ずつ順番に減らす
- ポイント③:ライフが無くなったらプログラムを止める(「すべてを止める」ブロックを使わない)
今回は「リスト」を使わないで変数だけでライフ(プレイヤーストック)をつくってみました。
「リスト」は苦手意識をもっている人がいるかもしれませんので、こんな方法でもクローンを1個1個識別できるということを実感してもらえたらと思います。
ただ、今後テキストコーディングをやるなら「リスト」は超重要になってくるのでScratchでも意識的に使っていくことをおススメします。
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)