mywayなプログラミング生活ブログ

プログラミング関連の記事を書いています。作る様子がわかる様に動画も作っています。

Scratch2(スクラッチ2)で壁打ちゲームを作ろう(3回目)

myway@おじさんです。
前回の続きで、「Paddle」の中に「Ball」が入ってしまうのを対応したいと思います。
ただし、今回の内容は、一つの方法として見て欲しいと思います。


動作環境について
OS:MAC OS X(Windowsでも操作はほとんど変わりません)
エディタ:Scratch offline editor(ver.456)

1.準備

前回保存したプロジェクトを開いて下さい。
画面右上の「ファイル」をクリックしてから、「ひらく」をクリックして、プロジェクトを開いて下さい。

それと、「Ball」のスクリプトを表示しておきます。

f:id:mywayhaojisan:20170709154055p:plain

 

2.なぜ、「Paddle」の中に「Ball」が入るのか?

原因は、「Paddle」の大きさと、「Ball」の移動する長さが原因です。
とりあえず下の画像を見て下さい。

f:id:mywayhaojisan:20170716164958p:plain
この画像は、「Ball」の動きを書いています。
1の「Ball」が開始、2の「Ball」は跳ね返ったあとになります。
順番に考えていきます。

(1)1の「Ball」は「Paddle」にふれていないので、「10ほうごかす」が動きます。

(2)「Ball」が「10ほ」うごいたあと「Paddle」にふれているので、「もしPaddleにふれたなら」スクリプトがうごいて「むき」が変わり、「10ほうごかす」がうごきます。ここで、2の「Ball」の場所に移動します。

(3)2の「Ball」の場所に動いたあと、まだ「Paddle」にふれています。
これが原因で、「もしPaddleにふれたなら」スクリプトが動いて、向きが左下になり、10ほうごきます。

(4)さらに、まだ「Ball」が「Paddle」にふれているので、また、上にはね返り、3の場所にうごきます。

この、(2)〜(4)のくりかえしで、「Ball」が「Paddle」の中をうごいてしまいます。

3.では、どうすればよいのか?

ここで、対応方法を考えてみます。

(例1)「Ball」の「10ほうごかす」を大きくする。
うごく長さを大きくする事で、はね返った後、「Paddle」にふれないようにする方法です。
この方法だと、「Ball」が早く動くので、ゲームとして、難しいものになってしまいます。

(例2)「Paddle」のサイズを小さくする。
上の(例1)の考え方の逆で、「Paddle」を小さくする事で、はね返った後に「Paddle」にふれないようにする方法です。
この方法だと、「Paddle」や「Ball」の大きさを決めるまで、時間がかかってしまいますし、同じ様な事を、他のプロジェクトでも行うとなると、とても面倒な事になってしまいます。

上の2例は、あまりよくない対応方法と思いますので、プログラミングで対応したいと思います。

4.スクリプトを書くまえに

どうやって対応するのかを考えてみたいと思います。

まず、原因として、
「1回はね返った後、Paddleにふれていて、もう1回はね返える」
となるとおもいます。
では、どうすれば良いかというと、原因の逆を考えれば良いのです。
「1回はね返った後、Paddleにふれていても、はね返らない」
となると思います。
これを覚えておいて、スクリプトを作ります。

5.スクリプトを書いてみる

スクリプトは下のようになります。

f:id:mywayhaojisan:20170716165040p:plain
もとのスクリプトから、けっこう変わりました。
変更した部分を説明します。

(1)へんすう「Paddleにふれた」の追加
へんすう「Paddleにふれた」を追加しています。
このへんすうは、「0」であれば「はね返える前」、「1」であれば「はね返った後」という意味を持たせたへんすうとして作っています。

(2)「ずっと」ブロックの上に「Paddleにふれた」へんすうに「0」を入れる
これがないと、「Ball」が「Paddle」にあたっても、はね返らない可能性があります。
理由は、この「Paddleにふれた」へんすうには、なにが入っているかわかりません。
もしかしたら「1」が入っているかも知れません。
なので、最初に入っていて欲しい値を入れておきます。

少し専門的な話になるのですが、これは、「へんすうの初期化(しょきか)」と言って、プログラミングをする上で、必要な手順です。
へんすうを使う場合は、この初期化(しょきか)を行う様にしましょう。

(3)「もしPaddleにふれたなら」ブロックを変更
今までは「もし...」ブロックでしたが、「もし...でなければ」ブロックに変えています。
このブロックを使う事で、「Ball」が動いたあと「Paddleにふれた場合」と「Paddleにふれない場合」の2つの動きを書く事ができます。
今回の場合、「Paddle」から「Ball」がはなれた場合、へんすう「Paddleにふれた」に「0」を入れる必要があるので、このブロックを使っています。

(4)「もしPaddleにふれたなら」の中に「もしPaddleにふれた=0なら」ブロックを追加
このブロックは、1回はね返った後、連続ではね返らない様にしています。
へんすう「Paddleにふれた」が「0」の場合(Paddleにふれていない状態)、はね返えるよう、向きを変え、へんすう「Paddleにふれた」に「1」を入れます。
「Paddleにふれた」が「1」の場合(Paddleにふれた状態)、はね返らないよう、向きを変えるスクリプトを動かさないようにしています。


今回はここまでです。
作ったら、必ず、「ほぞん」をするように心がけて下さい。

それと、今回も動画がありますので、よければ、参考にしていただければと思います。

youtu.be



次回は、画面内に物をおいて、障害物を作りたいと思います。


最後まで読んで頂いてありがとうございます。
皆さんに少しでもお役に立てれば幸いです。

<<壁打ち(2回目) 壁打ち(4回目)>>