Scratchでは「調べる」のコードとして「()に触れた」というものがあります。
ここに特定のスプライトの名前を入れることでスプライトとの接触判定を行うことができます。
ただし、複数のスプライトとの接触判定をしたい場合にはその分だけ「()に触れた」を用意すればよいのですが、数が多い場合にはコード数が増えます。
今回はなるべく少ないコードで複数のスプライトとの接触判定を行う方法について紹介します。
課題
例えば、次のようにスプライトとしてCATの他に、Ball1,Ball2,Ball3の三つのスプライトがあるとします。
CATが各ボールに接触したときに、それぞれのボールの名前を言うというスクリプトを作ろうと思います。
単純に考えると、「もし()なら」と「調べる」の中の「()に触れた」のコードを使用することで、各ボールに触れた際にボールの名前を呼ばせるように条件分岐を行うことで実現できそうです。
具体的には次のようなスクリプトで作ることができると思います。
このスクリプトを実際に実行した様子がこちらになります。
確かにもともとやりたかったことは実現できていますが、いくつか課題がありそうです。
例えば、「もし()なら」の中に「もし()なら」というものが入れ子状態になっているため、ボールの数が増えると入れ子の階層が増え続けてコードが複雑になり、可読性が悪くなってくるかもしれません。また、各条件判定事に毎回「()に触れた」の()の部分にスプライト名を個別に設定していく必要があるので、数が多いとちょっと面倒に感じたり、間違って別のスプライトを指定してしまったというバグも発生するかもしれません。
繰り返しを利用した方法
上の課題に対する実現方法は様々あると思いますが、今回は繰り返しを用いた実現方法について紹介します。
繰り返し用変数の用意
まず最初に、すべてのスプライト用として使える「繰り返し番号」という名前の変数を用意しておきます。
この繰り返し番号の役割としては、後々、Ballの番号を直接手打ちすることなく、自動的に番号を振るために使用するのですが、この時点では深く考えずにとりあえず作成しておけば大丈夫です。
接触判定用スクリプトの用意
次に、CATスプライトに対して以下のようなスクリプトを準備します。
これは次のような処理の流れになります。
- 変数「繰り返し番号」を0に初期化する
- 3回繰り返すループに入る
- 繰り返し番号に1を加える⇒ループ一回目は1が入る
- 「Ballと繰り返し番号」のスプライトに触れたかどうかの判定をする
- 触れていたら「Ball+繰り返し番号」を1秒いう
- 3回繰り返したら「繰り返し番号」を0に戻す
- 2~6をずっと実施する
簡単にまとめると、Ball1,に触ったか、Ball2に触ったか、Ball3に触ったかを繰り返し番号を用いて判定し、さらにそれらを常にループしながら接触判定を続けるというコードになっています。
また、「Ballと繰り返し番号」をいう表現を使用するところが重要になります。
これは例えば繰り返し数が1の時は「Ballと繰り返し番号」はBall1になり、繰り返し数が2の時はBall2になるということです。
つまり、人間が毎回Ballの番号を設定しなくても、繰り返し数のみを変更すればBallスプライトの数が増えたとしても同じ挙動にできることがメリットになります。コード作成のボリュームを減らすことができます。
実行した際の実際の動きは次のようになります。
繰り返し番号が絶えず1~3を巡回することですべてのボールとの接触を判定してくれています。
次に、繰り返し番号を4に変更した上で、スプライトとしてBall4を追加して実行してみます。
このようにBallの数が増えても問題なく動作することができました。
まとめ
変数と繰り返しを用いることで複数のスプライトに対して拡張性の高い接触判定を行うスクリプトを行うことができました。
次回はこれらのBallに接触した場合にBallが消えるというギミックを作っていきたいと思います。
コメント