【スクラッチ】スプライトを隠してもあたり判定になる

”隠す” のブロックは ”表示する” のブロックと一緒によく使いますよね。

ある男の子が下にあるようなホッケーゲームを作る時に、
ゴールを決めた後にボールが消えてスコアが1つずつ上がるプログラムにしました。

ところが、ボールは消えたままなのに
スコアが少しずつ上がっていく不思議な現象が起こりました。

ボールがないのに勝手にカウントされる

〇に触れた と 〇色に触れた で動きが違う

しばらく男の子が作ったスクリプトを眺めていたのですが、
何の問題もないように見えます。

何が違ったかというと。。。。。

“ボールがゴールに触れたならボールを隠す”
の条件が私だったら使わないブロックになっていました。

ゴールに触れたではなくて、

ゴールの色に触れたらという設定。 

きちんとゴールの色を指定しています。
条件としては何の問題もないですよね。。。。

ところが。。。。。。

これではボールは消えても、何故かスコアが入り続けてしまうのでした。

この状況を確認するために、次のスプライト用意しました。

  • 青いバー:ネコの当たり判定を青い色とスプライトのバーの2つの条件
  • 赤いリンゴ:あたり判定を赤い色とスプライトのリンゴの2つの条件
  • ネコ: ネコがバーとリンゴに当たるとスコアが上がるようにしています
  • 矢印:ネコが消えた時にネコの場所を分かるようにする  ー> これを作ったことで新たな事実が!

    1. ネコがリンゴやバーを通り抜ける間、スコアがどんどん上がります。(普通のことですね)
    2. ネコを隠してみると、青い色で当たりを判定するスコアだけがすごいスピードで上昇(異常です)
      バーに当たっているはずもないタイミングでも青色スコアの数字だけ上がっていきます。
    3. 隠したネコだとバーとリンゴに当たらなくてもスコアがあがると考えて、
      リンゴとバーの位置をネコに当たらない位置にずらすとスコアは上がらない
    4. 消えたネコの動きを可視化しようとネコの位置をしめす矢印を付けてみたところ
      他のプログラムには一切の変更を加えていないのにもかかわらず、
      ネコがリンゴに当たったであろう場所で色とスプライトに反応してスコアが変わる正常な動きとなった

          スコアと連携するような当たり判定は色ではなくスプライトを条件とするのが良い。

          特に今回のようにスプライトを隠す必要がある場合は、スコアが無茶苦茶になってゲームとして成り立たない。(ボールを隠した後、すぐに真ん中の座標に戻すことで回避することも可能)

          スプライトを隠して使う際に、別のスプライト(今回ケースでは矢印)を一緒に使うことで、背景にある色やスプライトの色を条件にして、面白いアクションを起こす事が出来るかもしれない。

      それぞれのブロックの違い

      スプライトの〇に触れた を使う時の条件

      スプライトの ”〇に触れた” のブロックを使う時は、
      皆さんも良く知っている通り、次のようになりますね。

      1. 自分の姿を隠している時はあたり判定とならない
      2. 自分のクローンや背景に触れるというスクリプトを作れない

      ところが、〇色に触れた のブロックを使うとどうなるか整理しましょう。

      〇色に触れた を使う時の当たり判定の条件

      ”〇色に触れた” のブロックを使う場合は

      1. 自分が”表示する”でも”隠す”でも当たり判定となる
      2. 自分のクローンや背景でも、当たり判定となる
      そら先生そら先生

      自分の姿を隠している場合に、〇色のスプライトや背景に当たった時の条件です。
      〇色のスプライトが姿を隠している時は、当たり判定とならないので、混同しないでください

      Scratchのブロックの動きや優先順位が明確に分からないままゲームを作っていると、
      思わぬところでつまずいて上手くいかない事もあるのですが、
      試行錯誤しながら解決策を考え出すのも子供たちには良い経験だと思います。

      当たり判定にはスプライトそのものに触れた事を条件とする方が簡単なんですが、
      私が教えているお子さん達は色で当たり判定をするのがどうも好きなようです。(なんででしょうか?)

      ”こうした方が早いのに” と思いながらも、
      子供たちのやりたい方法でやらせていると、 ”えっー”
      意外な新たな発見をすることも多く、それはそれで新鮮で楽しいですね。(大変な時もありまーす)