Scratchで表示・非表示を変数で切り替える方法|持ち物の表示とメニュー開閉【Grow a Garden②】

Robloxで大人気の農園ゲーム「Grow a Garden」を、Scratchでゼロから作っていく全5回シリーズ。第2回は、持っているタネや作物を画面に表示するしくみと、売り場のメニューを開くしくみを作ります。
この回のテーマは「変数の数字が変わると、画面の見た目が変わる」。引数付きのブロック定義や、画面の「なか」の状態を別の変数で持つ考え方など、上級者向けの設計を解説します。

このシリーズについて

Grow a Garden をScratchで作る全5回シリーズです。この記事は第2回です。

第1回 3つの画面を切り替える
https://kidsprogram.co.jp/scratch30/growagarden1

第2回 持ち物・売るメニューの表示 ← いまこのページ
第3回 タネを選ぶ + 買う(準備中)
第4回 植える + 育つ(準備中)
第5回 収穫 + 売る(準備中)

前回の記事

Scratchで画面切り替えを作る方法|クローンと変数で3つの画面を管理する【Grow a Garden①】

第1回のおさらい

第1回では、変数「現在の画面」をひとつ作り、それぞれのスプライトが自分で「今は自分の番か?」を見張って、表示・非表示を決めるしくみ(ポーリング)を作りました。

Buttonスプライトはクローンで3つのボタンを並べ、押されると自分のコスチューム名を「現在の画面」に入れます。Garden・Seeds・Sell・Slot は、その値をずっと見張って自分で出たり隠れたりします。

このしくみが、第2回以降のすべての土台になります。まだの方は先に第1回をご覧ください。

【Scratch上級 2/5】Grow a Garden:持ち物・売るメニューの表示【授業まるごと公開】

KIDSPROのオンライン授業を、そのまま公開!実際にスクール生と一緒に作った1時間の授業を、ほぼ編集なしでお届けします。

【オンライン授業後に動画アップします】

━━━━━━━━━━━━━━━━━━
▼ 目次
━━━━━━━━━━━━━━━━━━

【上級編2/5】Grow a Garden:持ち物・売るメニューの表示

https://scratch.mit.edu/projects/1386489987/

第2回で作るもの

・持っているタネや作物の数が 0 のときはスロットが消え、1以上になると出てくる
・タネのスロットを押すと、どちらのタネを選んでいるかが決まる
・売り場の「E」ボタンを押すと、メニューが開いて「売る」「やめる」に切り替わる
・ゲーム全体で使う15個の変数を、ステージで初期化する

この回では、まだタネを買うことはできません。
動きを確かめるときは、ステージに表示されている変数の数字を、自分で書きかえてみてください。
買えるようになるのは第3回です。そのとき、この回で作った画面が一気に動き出します。

▼ この回で使うテンプレート
https://scratch.mit.edu/projects/1386493532/

▼ 第2回の完成版
https://scratch.mit.edu/projects/1386489987/

★全5回を作りきった「フル機能版」はこちら↓
https://scratch.mit.edu/projects/1310372588/

ステージ

ステージのスクリプト

15個の変数を初期化するコード
  1. 旗をクリックしたら、変数「現在の画面」の値を「Title」にします。ゲームはタイトル画面から始まります。
  2. 「初期所持金」を10にし、「¢」に「初期所持金」を入れます。¢ が、プレイ中に増えたり減ったりする実際の所持金です。
  3. 「選択中の種」を「none」にします。まだどのタネも選んでいない、という意味の値です。
  4. 「メニュー開いてる」を0にします。売り場のメニューは閉じた状態から始まります。
  5. 持ち物の4つ(キャロットの種・イチゴの種・キャロット・イチゴ)を、すべて0にします。何も持っていない状態からのスタートです。
  6. 最後にねだんを決めます。キャロットの種の買値=10、キャロットのロット数=10、キャロットの売値=5、イチゴの種の買値=50、イチゴのロット数=5、イチゴの売値=20。
  7. これで、ゲーム全体で使う15個の変数がすべて決まった状態でスタートします。変数の初期化がひとつでも抜けていると、「前に遊んだときの数字」が残ったままゲームが始まってしまい、原因の分かりにくいバグになります。
15個の変数は、4つのグループに分けて考える

数が多いように見えますが、役割ごとに分けるとすっきりします。

  • もちもの キャロットの種/イチゴの種/キャロット/イチゴ … 持っている数。ゲーム中に増えたり減ったりする
  • ねだん キャロットの種の買値/イチゴの種の買値/キャロットの売値/イチゴの売値/キャロットのロット数/イチゴのロット数 … 最初に決めたら変わらない
  • 今のようす 現在の画面/選択中の種/メニュー開いてる … 「今どうなっているか」を覚えておく
  • おかね 初期所持金/¢ … 旗を押したときに、初期所持金を ¢ にコピーする

「買値」だけ「〜の種の買値」という名前になっているのは、買うのは「タネ」、売るのは「収穫した作物」だからです。キャロットの種の買値は10、キャロットの売値は5。同じ「キャロット」でも、買うものと売るものが違うので、名前で見分けられるようにしてあります。

Slot(スロット)

Slot(スロット)のコスチューム

コスチューム名:CarrotSeed

コスチューム名:StrawberrySeed

コスチューム名:Carrot

コスチューム名:Strawberry

コスチューム名:Highlight

 

表示判定のブロック定義

個数で表示・非表示を決めるコード
  1. 「表示判定」は、「個数」という引数(ひきすう)をひとつ受け取るブロック定義です。
  2. 受け取った「個数」が0より大きければ、ステージに表示します。
  3. 0以下(つまり0個)ならば、ステージから姿を消します。
  4. これにより「持っていないものは、スロットに出さない」というルールが1か所にまとまります。
引数付きのブロック定義とは?

同じ形の処理を4回書くかわりに、変わるところだけを外から渡せるようにしたのが「引数付きのブロック定義」です。
ここで渡しているのは変数そのものではなく、変数の中身(数)です。「表示判定(キャロットの種)」と書いたとき、ブロックの中に届いているのは「キャロットの種」という名前ではなく、その変数に入っている「3」などの数字です。

PythonやJavaScriptの関数の引数と、まったく同じ考え方です。

Slot(スロット)のスクリプト

4つのSlot(スロット)と1つのハイライトを生成するコード
  1. 旗をクリックしたら、スプライト本体はステージから姿を消します。
  2. 続いて「スロット作成」を実行します。これは「ブロック定義」で自分で作ったブロックです。
  3. 「スロット作成」が実行されると、Slot(スロット)のスプライトはX座標=-75、Y座標=-155に瞬間移動し、コスチュームを「CarrotSeed」にします。次に自分自身のクローンを生成し、次のコスチュームに変更してからX座標を50ずつ変える処理を5回繰り返します。
  4. これにより、「CarrotSeed」「StrawberrySeed」「Carrot」「Strawberry」の4つのスロットと1つの「Highlight」がステージ下部にX座標−75から右へ50ピクセル間隔で生成されます。しかし、本体が隠れている状態でクローンを作ったので、クローン自体もステージから隠れた状態で生まれます。

 

クローンされた時に実行するコード
  1. Slotがクローンされたとき、次の処理をずっと繰り返します。
  2. もしも変数「現在の画面」の値が「Title」ならば、ステージから姿を消します。タイトル画面では持ち物を出しません。
  3. 「Title」以外ならば、いったんステージに表示してから、自分のコスチューム名を見てそれぞれの持ち物の数を調べます。
  4. コスチューム名が「CarrotSeed」なら「表示判定(キャロットの種)」、「StrawberrySeed」なら「表示判定(イチゴの種)」、「Carrot」なら「表示判定(キャロット)」、「Strawberry」なら「表示判定(イチゴ)」を実行します。
  5. コスチューム名が「Highlight」のクローンは、ここではまだ「隠す」だけにしておきます。この中身は第3回で差し替えます。
  6. これにより、ステージの変数「キャロットの種」を0にするとキャロットのスロットが消え、3にすると出てくるようになります。5つのクローンはまったく同じスクリプトを持っているのに、自分のコスチューム名を見ているので、それぞれ違う変数を担当できます。

タネを選ぶコード
  1. コスチューム名が「CarrotSeed」のスロットを押すと、変数「選択中の種」に「キャロットの種」を入れ、「Correct音」のメッセージを送ります。
  2. コスチューム名が「StrawberrySeed」なら、「選択中の種」に「イチゴの種」を入れます。
  3. コスチューム名が「Carrot」「Strawberry」のスロット(収穫した作物)を押すと、持っている数を2秒間しゃべります。
  4. 変数「選択中の種」は、第4回で「どちらのタネを畑に植えるか」を決めるときに使います。第2回の時点では、ステージの変数表示が切り替わるのを見て確かめてください。
画面チェックがいらない理由

このスクリプトには「もし現在の画面が◯◯なら」というチェックが入っていません。ミスではなく、必要がないからです。

Scratchの「このスプライトが押されたとき」は、隠れているスプライトやクローンでは反応しません。第1回で作った「ずっと現在の画面を見張って表示・非表示を決める」というしくみが、そのままクリックの入り口のフィルターにもなっているのです。

表示のしくみをきちんと作っておくと、あとの処理が短く書ける。第1回の設計が効いている場面です。

SellOptionButton(売るメニュー)

SellOptionButton(売るメニュー)のコスチューム

コスチューム名:E

コスチューム名:Sell

コスチューム名:Keep

 

SellOptionButton(売るメニュー)のスクリプト

3つのボタン(クローン)を生成するコード
  1. 旗をクリックしたら、スプライト本体はステージから姿を消します。
  2. 続いて「Eを表示」を実行します。これは「ブロック定義」で自分で作ったブロックです。
  3. 最前面へ移動したあと、幽霊の効果を10にして、X座標=3、Y座標=-40 でコスチュームを「E」にし、クローンを作ります。「E」ボタンだけ少しだけ透けているのは、売り場の絵になじませるためです。
  4. 次に幽霊の効果を0に戻し、X座標=-110、Y座標=-58 でコスチュームを「Sell」にしてクローンを作ります。
  5. さらにY座標を-36ずつ変えてからコスチュームを「Keep」にして、もうひとつクローンを作ります。
  6. これにより「E」「Sell」「Keep」の3つのクローンができます。本体が隠れている状態でクローンを作ったので、クローンも隠れた状態で生まれます。このコードだけでは、まだボタンは見えません。

クローンされた時に実行するコード
  1. クローンされたとき、次の処理をずっと繰り返します。
  2. もしも変数「現在の画面」の値が「Sell」ならば、さらに自分のコスチューム名を調べます。
  3. コスチューム名が「E」なら、変数「メニュー開いてる」が0のときだけ表示し、1のときは隠します。
  4. コスチューム名が「E」以外(「Sell」と「Keep」)なら、逆に「メニュー開いてる」が1のときだけ表示し、0のときは隠します。
  5. 変数「現在の画面」の値が「Sell」以外ならば、姿を消したうえで、変数「メニュー開いてる」を0に戻します。

表で見る:3つのボタンがいつ出て、いつ隠れるか

左の2列が「変数がこうなっているとき」、右の2列が「ボタンはこうなる」です。「E ボタンが出ている=メニューは閉じている」「E ボタンが隠れている=メニューが開いている」という関係になるよう、メニューの列を E ボタンの左に置いてあります。

最後の「メニュー開いてるを0にする」がとても大事
この1行がないと、メニューを開いたまま「Garden」ボタンで畑にもどり、もう一度「Sell」に来たときに、メニューが開きっぱなしの状態で始まってしまいます。

売り場を出るときに閉じておく、という後片づけをここでやっています。
「画面から出るときに、その画面の中の状態をリセットする」という考え方は、どんなプログラムでもよく出てくる大事な作法です。

Eボタンを押してメニューを開くコード
  1. クローンがクリックされたとき、もしコスチューム名が「E」ならば、「Correct音」のメッセージを送り、変数「メニュー開いてる」を1にします。
  2. 「メニュー開いてる」が1になると、上の表示ループが自動で気づいて、「E」ボタンが消え、「Sell」「Keep」の2つが現れます。
  3. 「Sell」「Keep」を押したときの中身は、まだ空にしてあります。売る計算は第5回、収穫した作物ができてから作ります。「あとで中身を入れる場所」を先に用意しておく、という進め方です。
なぜ「現在の画面」を SellDetail にしないのか

「メニューが開いている状態」も画面の一種なので、変数「現在の画面」に「SellDetail」という値を足せばいいようにも思えます。でも、それではうまくいきません。

売り場の背景パネル(Sellスプライト)が消えてしまうからです。Sellスプライトは「現在の画面 = Sell」のときだけ表示するようになっているので、値を「SellDetail」に変えたとたん、メニューの下にあるはずの売り場そのものが消えてしまいます。

見分けの原則はこうです。

  • 横に並んでいて、同時にはひとつしか選べないもの → 同じ変数(Seeds / Garden / Sell)
  • 何かの「なか」に入っているもの → 別の変数(メニュー開いてる)

Seeds・Garden・Sell は横に並んでいるので「現在の画面」ひとつで足ります。メニューは Sell の中に入っているので、別の変数で持ちます。

動きを確かめてみよう

変数を手で書きかえてチェック

第2回では、まだタネを買うことができません。
ステージに表示されている変数の数字をダブルクリックして書きかえ、画面が思ったとおりに動くかを確かめてください。

  1. 「現在の画面」を Garden にする → 畑が出る
  2. 「現在の画面」を Seeds にする → タネ屋さんが出る
  3. 「キャロットの種」を 0 にする → キャロットのスロットが消える
  4. 「キャロットの種」を 3 にする → キャロットのスロットが出る
  5. 「現在の画面」を Sell にする → 売り場。E ボタンが出る
  6. 「メニュー開いてる」を 1 にする → E が消え、売る/やめる が出る
  7. 1 のまま「現在の画面」を Garden にする → 3つとも消える
  8. そこから「現在の画面」を Sell に戻す → E ボタンから始まる
  9. タネのスロットを押す → 音が鳴り、「選択中の種」の表示が変わる

7・8番が合格ラインです。ここが通れば、「画面のなかの状態」が正しく作れています。

次回予告

第3回 タネを選ぶ + 買う

次回は、いよいよタネが買えるようになります。

・第2回で「隠す」だけにしておいた Highlight の中身を作り、選んでいるタネが光るようにする
・Seedsスプライトに購入の処理を書き、所持金を減らしてタネを増やす

第2回で作った画面が、そのまま動き出す回です。

Scratch3.0(スクラッチ3.0)とは?

MITメディアラボにより開発されたビジュアルプログラミング言語。子供たちが物語やゲーム、 アニメーションなどのインタラクティブな作品をプログラミングできる。また、自分の作った作品を世界中の人々と共有できるコミュニティーサイトでもある。世界中で1億人を超えるユーザがいる。
こちらのホームページにアクセスすれば無料で利用できる。