スクラッチプログラミング

4-2 チャレンジ タコスの時間

タコスを食べる犬

犬のスプライトDog2はタコスが大好きです。ループを使ってタコスを食べさせてやりましょう。

ステップ1

新しいプロジェクトを作成し、プログラムの実行に必要なスプライトを読み込みます。

  1. 新規プロジェクトを作成し([ファイル]->[新規])、プロジェクト名を「タコスの時間」にします。
  2. ネコのスプライトは使わないので、[スプライトリスト]にある[Sprite1](ネコのスプライトの名前)の右上にあるゴミ箱アイコンをクリックして、プロジェクトからネコのスプライトを削除します。
  3. [スプライトリスト]の右下端にあるネコのアイコン([スプライトを選ぶ]ボタン)にカーソルを重ね、表示される[虫メガネ]をクリックします。
  4. スプライトライブラリが表示されるので、[動物]ボタンをクリックして動物を表示し、[Dogs2]スプライトをクリックします。
  5. 元の画面に戻り、[スプライトリスト]とステージに犬のスプライトが追加されます、
  6. 同様にして、食べ物のTacoスプライトを追加します。
  7. 犬のスプライトを左に、タコスのスプライトを右に配置します。

ステップ2

タコスが犬と同じくらい大きいので、半分の大きさにします。

  1. [スプライトリスト]でTacoをクリックします。すると[コードエリア]にTacoの絵が表示されます。これがTacoスプライトの[コードエリア]です。
  2. [コード]タブをクリックし、[イベント]->[緑の旗が押されたとき]コードブロックを[コードエリア]にドラッグ&ドロップします。
  3. [見た目]->[大きさを( )%にする]コードブロックを[コードエリアにドラッグし、[緑の旗が押されたとき]にドロップして吸着させます。
  4. [大きさを( )%にする]の円内をクリックして選択し、半角で50を入力します。
  5. [見た目]->[表示する]を(3)の下にドラッグ&ドロップします。

タコスは見えているのに、なぜ「表示する」のか、奇妙に思えるかもしれません。実はこの後、犬がタコスを食べ、見えなくすることで食べたことを表します。プログラムを1回だけしか実行しないのなら問題はないのでしょうが、2回以上実行するなら、その場合に備えてここで、(前回に非表示になった)タコスを表示しておく必要があります。そうしないとタコスは消えたまま(食べられたまま)で、食べるべきタコスがないことになります。

ステップ3

犬の位置を決めます。

  1. [スプライトリスト]で犬のスプライトをクリックします。
  2. [イベント]->[緑の旗が押されたとき]コードブロックを犬のスプライトの[コードエリアにドラッグ&ドロップします。
  3. [動き]->[x座標を( )、y座標を( )にする]コードブロックを、(2)の下に吸着させます。
  4. 下図の例では、(-168, -93)になっています。

[動き]のコードブロックの中には、ドラッグしたスプライトの座標を自動的に読み取るものがあります。犬のスプライトをステージ上でドラッグすると、[動き]カテゴリにある[x座標を( )、y座標を( )にする]や[(1)秒でx座標を( )に、y座標を( )に変える]、[x座標を( )にする]、[y座標を( )にする]コードブロックの円内には、移動先のxとy座標の値が自動的に入ります。

ステップ4

タコスを食べる位置に犬をドラッグし、犬がその位置に来るようにコードブロックを追加します。

  1. 犬をドラッグして、タコスを食べるように見える位置に置きます。
  2. [動き]->[(1)秒でx座標を( )に、y座標を( )に変える]コードブロックをドラッグし、前の(3)の後に吸着させます。秒数を2にします。
  3. [緑の旗]ボタンをクリックしてプログラムを実行します。犬がタコスの方に動いて、やがて止まります。
  4. しかし、犬をドラッグして位置を調整しプログラムを実行すると、犬の方がタコスよりも手前に来て、犬がタコスをくわえるように見えなくなります。このような場合には、スプライトの重なりを調整します。

  5. タコスのスプライトをクリックして、タコスの[コードエリア]に、[見た目]->[(最前面)へ移動する]をドラッグします。
  6. [表示する]を一度下にドラッグして切り離し、[大きさを(50)%にする]の下に[(最前面)へ移動する]を吸着させ、その下に[表示する]を持ってきます。

重なりは下図のように考えることができます。下図はステージやスプライトを真上から見たところで、みなさんは下の目玉の方から見ています。

一番奥にあるのはステージです。その手前に犬のスプライトがあり、さらにその手前にタコスのスプライトがあります。重なりを最前面へ移動する、ということは、上から見たときの、一番目玉に近い位置にスプライトを移す、ということです。

ステップ5

犬は移動中、ただ横に滑っているようにしか見えないので、足を動かすようにしてみましょう。そのためには、犬のコスチュームを切り替えます。
スプライトDog2には3つのコスチュームが用意されていて、歩行に使えるのは下図のdog2-aとdog2-bです。この2つを交互に切り替えることで、歩いているように見えるアニメーションを作ります。

  1. 犬のスプライトに手を加えるので、[スプライトリスト]で犬のスプライトが選ばれていない場合、[Dog2]をクリックします。
  2. [コード]タブの[見た目]->[コスチュームを( )にする]をドラッグし、[(2)秒でx座標を…]の下にドロップして吸着させます。コードブロックの下向き矢印はクリックすると選択肢が表示されることを示しています。下向き矢印をクリックし[dog2-a]を選びます。
  3. [制御]->[(1)秒待つ]をドラッグして、(2)のコードブロックの下にドロップします。秒数の1は半角の0.2にします。
  4. 座標や秒数などは、足したり引いたりできる数値なので、全角ではなく、必ず半角で入力します。

  5. (2)と同じ要領でコスチュームを変えるブロックをドラッグ&ドロップし、今度は[dog2-b]にします。
  6. [緑の旗]ボタンをクリックして、ここまでのプログラムを実行します。しかし結果は思ったようにいきません。犬は横滑りしたまま右に移動し、最後に1回だけ足を動かします。
  7. これはコンピュータの特徴です。コンピュータは1度に1つのことしかできません。コードブロックに書かれた1つのことを忠実に実行し、それが終わったらその下に書かれているコードブロックの命令を実行します。

今の場合は、犬の移動と、犬の足を動かすことを同時に行いたいので、スクラッチの場合は、同じ種類のイベントブロックを使って、別々のスクリプトを作成します。これにより、2つの別個の動作を同時に行うことができます。

ステップ6

犬のスクリプトを2つに分けます。

  1. [イベント]->[緑の旗が押されたとき]を犬のスプライトの[コードエリア]にドラッグ&ドロップします。
  2. 2つある上の方の[コスチュームを( )にする]を下にドラッグしてスクリプトを切り離し、(1)の下に吸着させます。
  3. [緑の旗]ボタンをクリックして、プログラムを実行します。犬は左から右への移動中に、1回だけ足を動かします。


2つのスクリプトは、[コードエリア]でクリックすると、それぞれを単独で実行することができます。上図のスクリプトをクリックすると、犬が右へ移動しやがて止まります。下のスクリプトをクリックすると、犬はその場で1回だけ足を動かします。

ステップ7

犬は1回だけ足を動かし、後は横滑りして移動するように見えるので、移動中に足をずっと動かして見えるようにしましょう。そのためにはまず、コスチュームが変わったことを表示する時間が必要なので、下図のように、コスチュームをdog2-bに変えるコードブロックの後に0.2秒待つブロックを追加します。

そして、このコスチュームの変更を4回行うなら、[緑の旗が押されたら]より下の4つのコードブロックを4回繰り返せばよいわけです。しかし4回くらいならまだよいですが、50回とか100回とかになったら、コードブロックを複製するだけでも大変で、そのうちミスも生まれます。

繰り返しは、同じコードを何回も繰り返したい場合に使用します。

  1. [緑の旗が押されたとき]を、ほかのブロックから切り離します。
  2. [制御]->[( )回繰り返す]を犬のスプライトのコードエリアにドラッグし、[緑の旗が押されたとき]に吸着させます。( )内の繰り返す回数は4にします。
  3. 繰り返す4つのブロックをドラッグし、[(4)回繰り返す]ブロックの中にドロップします。
  4. プログラムを実行します。犬が歩いて、タコスのあるところまで移動します。

[( )秒でx座標を( )に、…]の秒数を小さくすると、犬の移動スピードがアップします。また[(0.2)秒待つ]の待機は重要です。これがないと、その上のコスチュームを表示する時間がないので、足が動いてみえません。

足踏みと横滑り問題

移動にかける秒数と繰り返しの回数が合わないと、犬はそこで足踏みをするか、横滑りをして止まります。移動距離や移動にかける時間、待機時間などを調整すると、うまく止まるように見えます。

ステップ8

タコスを食べるようにしましょう。もちろん実際に食べるわけはないので、タコスを非表示にすることで、食べたように見せます。
犬は、プログラムがスタートしてから2秒後にタコスの位置に到着するので、このタイミングでタコスを非表示にすることにします。

  1. [スプライトリスト]でTacoをクリックしてTacoの[コードエリア]を開きます。
  2. [制御]->[(1)秒待つ]をドラッグして、既にある[表示する]に吸着させ、秒数を2に変えます。
  3. [見た目]->[隠す]をドラッグし、[(2)秒待つ]の下にドロップします。
  4. [緑の旗]ボタンをクリックして、プログラムを実行します。犬が到着した後にタコスが消えれば成功です。

とはいえ、これは2秒後にタコスを非表示にする、というプログラムです。犬の移動時間を変更すると、タコスを消す時間も変更する必要が出てきます。
スクラッチにはイベント処理とブロードキャストという方法があり、これを使うと、犬から「食べた」というメッセージを送り、そのメッセージをタコスが受け取ったタイミングでタコスが非表示にできるので、秒数を考慮する必要がありません。

このイベント処理とブロードキャストについては8回めで学ぶ予定です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です