2018年2月20日火曜日

Scratchでプログラミング その16 残りライフをイラストで表現

Scratchの使い方解説です、今回の難易度はNormal

記事をまとめたページはこちら。

前回は残りライフを画面に表示しましたが、味気ないものでした。
今回はクローンを使って残りライフを表示します。




0.目次


  1. シルエットの作成
  2. クローンで残りライフを複製
  3. ダメージを受けたときライフを減らす


1.シルエットの作成

これが前回作った残りライフ

変数をそのまま使用していて見えにくいです。

まずは表示していたライフを非表示にします。
ライフを右クリックして「隠す」を選択すれば非表示にできます。



次にライフを表示するためのスプライトを追加して画面の左上に配置します。
スプライトの名前は「残りライフ」に変更しています。


作成した「残りライフ」の見た目をシルエットのみにします。


「残りライフ」に以下のコマンドを追加します。

シルエットへの変更には見た目の「明るさの効果を-100にする」を使用しました。

「明るさの効果を-100にする」は、の効果を0にする」の「」部分を変更してください。



2.クローンで残りライフを複製

今回はライフを5つという設定にしてみました
(プレイヤーでライフを3に設定している場所は直してください)

以前に使用したクローンを利用してライフを5つ分表示します。
ここまでの作り方を利用すると、こんな風なコマンドまでは作れると思います。
ただし、このままだとクローンは同じ場所に重なって配置されます。
敵キャラなどと違って、自動で移動していくものでもないし、乱数でランダムな位置に表示するものでもありません。

ここでは変数を使用します。

データの「変数を作る」ボタンをクリックして残りライフのアイコンを管理する「LifeIcon」を作成します。
この変数は「このスプライトのみ」にチェックを入れてください。

この変数を利用してコマンドを編集します。
メインの「旗がクリックされたとき」側のブロックに
データの「LifeIconを1にする」で初期値を1に指定しています。

そして、クローンを繰り返すごとに「LifeIconを1ずつ変える」ようにしました。
こうすることで、クローンを作るたびに変数LifeIconは1,2,3,4,5とだんだん数字が変わっていくことになります。


「クローンされたとき」側のコマンドではx座標の指定LifeIconを指定します。
x座標の指定LifeIcon×30という座標を指定しています。
クローンが作られるたびに、変数LifeIconは1,2,3,4,5という値がだんだんと増えていきます。なので、x座標は30、60、90、120、150と30ずつ変化します。

3.ダメージを受けたときライフを減らす

ダメージを受けると変数Lifeを1ずつ減らしています。

「残りライフ」の各クローンは変数LifeIconと変数Lifeの値を比較しています。
Lifeが徐々に減っていって、各クローンの持つLifeIconより小さくなったときクローンを削除してしまいます。

これで「残りライフ」が表示できました。


4.グローバル変数とプライベート変数

今回のポイントとして
  • 変数Lifeグローバルな変数
  • 変数LifeIconプライベートな変数
という点があります。

変数Lifeは作成時に「すべてのスプライト」を選択しました。
「すべてのスプライト」を選択した変数は
「プレイヤー」でも「残りライフ」でも使用できます。
また、どこかで値が変更になったときに、他で使用している場所も全て値が変更になります。
このような変数をグローバル変数だったりパブリックな変数と呼びます。

それに対して、変数LifeIconは「このスプライトのみ」を選択しました。

「このスプライトのみ」を選択した場合はスプライトごと(クローンごと)に別々に値を保持します。どこかで変数を変えても、そのスプライト(クローン)意外には影響ありません。
なので、変数LifeIconは「残りライフ」では表示されますが、「プレイヤー」のスプライトでは変数として表示されません。
また、各「残りライフ」ごとに1,2,3,4,5という異なる値を持ち続けていました。
このような変数をプライベート変数と呼びます。

変数をどちらで作るべきかは使用方法によって変わります。
基本的には「このスプライトのみ」を使用すべきです。

どこからでも変更可能な「すべてのスプライト」の方が便利そうに見えますが、
どこからでも変更可能ということは大きなプログラムでは、どこで値が変えられたかわからなくなるという危険があります。
そのため影響範囲がわかりやすい「このスプライトのみを」を使うほうが良いです。

ただし、今回のLifeのように各スプライトで値を使いたいものについては「すべてのスプライト」を選択しましょう。
また「すべてのスプライト」を使用した場合でも出来るだけ値を変更するのは1つのスプライトに限定して、他のスプライトからは値を変更せずに数字の比較などに使用するだけにしたほうが、バグが発生しにくいです。

グローバル変数である「すべてのスプライト」のような変数は、あまり沢山用意しないのが理想です。今回はLifeIconに「すべてのスプライト」を使用しましたが、メッセージを併用することで「このスプライトのみ」に変更しても同じ動きをすることができます。