どのスプライトに当たったか確認できる画像

原因を探す方法

「こういう時にはこうなって、この条件の場合はこうして」
「ああなって、こうなって」スプライトの動きを頭でイメージしながら、ブロックを重ねていきます。

「これで、おもしろいんじゃない?」
いざ実行
「あれ、おっかしいなー」 「上手くいくはずなのに」

どこが原因かを探すためのデバッグの方法

スクラッチのプログラムは、スクリプトに記述した順番通りに動いています。
自分で作ったスクリプトのどこまでがキチンと動いていて、どこから実行されないかを確認しましょう。

生徒さんB生徒さんB

具体的にはどうしたら良いのですか?


そら先生そら先生

音のブロックや見た目のブロックを入れることで、実行されているかを確認します。

スプライト(Mouse1)に触れたかどうかを確認するために、音(meow)を鳴らすブロックを入れます。
音を出すブロックをいれて確認する画像

音がしなければ、Mouse1に当たってない(とプログラムが認識している)ことがわかりますよね。

今度は、ネコのスクリプトに”こんにちは”と言うブロックを入れてみます。

Mouse1に触れたことを確認するためには、”こんにちは”ブロックをいれるのですが、
どこに入れるか分かりますか?(”Mouse1に触れたなら”の次です)

スプライトにしゃべらせて当たり判定を特定する
どのスプライトに当たったか確認できる画像

ブロック削除のメッセージを受けているかを確認するためには、
先ほどと違う場所に”こんにちはを言う”ブロックを入れる。

すると次のように、メッセージを受けていることが確認できますよね。(”ブロック削除を受取ったとき”の次です)

メッセージを受けているかを確認する画像

 

ネコが”こんにちは”を言わなければ、
そもそもメッセージを受けていない=>メッセージを送るブロックまでのスクリプトを確認する

という風に、どこのスクリプトで動きが止まっているかを順番に確認をしていきます。

スクリプトの修正と確認を簡単に行なう方法

原因を調べるためにスクリプトを修正してプログラムを実行する時に、緑の旗をクリックして最初から動きを見ていく必要はありません

下の動画にあるように、問題だと思う場所のスクリプトをクリックして動きを確認しましょう。

手軽にプログラムを実行する動画

 

 

 

 

 

 

 

動画の説明
  1. 確認をするときに、スプライトが表示されているスクリーン上の緑の旗マークを押して最初から見ていく必要はありません
  2. 例えば、ネコを並べるためにはネコのスクリプトの”旗がおされたとき”のブロックをクリックすればネコのクローンがでてきます。
  3. ネコが”ブロック削除”のメッセージを受取っているかを確認するために、Mouse1のスクリプトに移動します。
  4. Mouse1のスクリプトの中の”ブロック削除を送って待つ”のブロックをクリックできるように、スクリプトから抜き出します。
  5. Mouse1をネコに触れさせてから、”ブロック削除を送って待つ”をクリックする
  6. ネコが消えた事が確認できますね。

このように、ブロックをクリックすることで、一つ一つのスクリプトの動きを順番に確認することができますよ。

よくある問題点

子どもたちが作るスクラッチで問題となることが一番多いのは、スプライト同士が触れた時のあたり判定でしょうか。

あたり判定の問題

スプライト同士が触れた時に、次のような動作が起きないことで「なんでー」「どうしてー」となる事が多いですね。

  • スプライトが消えない
  • スコアがきちんとカウントされない
  • メッセージが送られない

同じような事象が良くある方は、別の記事で対処方法についての説明をしているので、よかったらご覧になってください。
↓↓↓

基本通りにやっても上手くいかないあたり判定の解決方法

ブロック崩しをブロックをネコのスプライトで作った時に、ネズミ(ボールの代わり)に当たってもネコ(ブロック)が消えない事象が出てきました。

普通のブロック崩しのように、四角いブロックとボールのコスチュームに代えてやってみると、すべてのブロックが問題なく消えてスコアもきちんとカウントされました。

ネコとネズミというコスチュームの組み合わせが問題を起こしているのは明らかですが、どうにか解決できないかをやってみました。

普通のブロックに変えた画像

ネズミ(動画の中ではマウスと言っています)がネコに当たると跳ね返るので、ネズミはネコに当たっていることを認識しているようです。問題はネコがネズミに当たったと認識していない点なので、それをメッセージでカバーしました。
詳しくは下の動画を見てください。
↓↓↓

スプライトが同士が触れた時に、スプライトが消えてくれない場合やスコアがきちんとカウントされない場合に、相手のスプライトにメッセージを送って対応したケースはいくつか経験があるので、みなさんも試してみて下さい。

ポイント
””メッセージを送って待つ”
  • ”メッセージを送って待つ”が良い。 ただの”メッセージを送る”のブロックを使うと、メッセージを送った先のプログラム処理が終わる前に、送った側のプログラムが先に進んでしまいタイミングが合わない事があります。
  • ”メッセージを受けたとき” ”もし、相手スプライトに触れたら”の条件がセットになることが多いです。
  • なぜかといえば、クローンのスプライトAが10個あって、そのうちの1個がスプライトBに当たった時に消えるプログラムにしたい場合、”もし、Bに触れたら”というスクリプトがないと10個のすべてのAが消えてしまいます。