5 障害物を作ってみよう

このプロジェクトでは,車のワープや障害物の製作を通じて,オブジェクトの持っている「変数」とその「値」という概念を学びます. 変数の値を変更するための「変更タイル」を使えば,「座標」変数を使ってオブジェクトを動かすことができます. また,「変数タイル」を場合分けと組み合わせることにも挑戦します.

プログラミングに関するキーワード

Squeakに関するキーワード

5.1 変数

M先生
さて,次のプロジェクトに進もう.今度はproject4だね.
Sくん
実は既に少し実験をしてました.
M先生
どんなことだい.
Sくん
障害物の岩石を作ってみたんです.これに車が衝突すると,車がスタート地点にワープするようなものを作りたいんです.

M先生
なるほど.ちょうどいい例題だね.
Tさん
私も一緒に考えてたんですけど,どうやったらいいか分からなくて.
M先生
車をワープをさせるためには,ビューアーの新しい使い方を勉強する必要がある.車のビューアーを開いてごらん.
Sくん
はい.
M先生
これまでは基本やセンサーといったカテゴリを使ってきたけれど,「X座標」や「Y座標」と書かれたタイルを探してくれるかい.
Sくん
ありました.

M先生
これを「 変数タイル 」と呼ぶ.車をマウスで動かすとタイルの表示はどうなるかな?
Sくん
数値が変わりますね.今までは気にしてなかったけど,「方向」とか,他にも色々な変数タイルがあるんですね.
Tさん
あっ,オブジェクトの変数を見るためのものだから,ビューアーという名前なんですね?
M先生
その通り.車をマウスでつかんで動かすと,座標の 値 はどうなる?
Sくん
車の位置によって変化しますね.

M先生
色々動かして,Squeakの画面の「 座標 」がどうなっているかを調べてみなさい.
Tさん
X座標は横方向の位置を表しているようですね.Y座標は縦方向です.
Sくん
画面の右上に行くにしたがって増えていくから,左下が(0,0)となりますね.
Tさん
図で描くとこんな感じかな.

Sくん
数学でやったXとYの座標軸とおんなじだ.
M先生
そうだね.

5.2 変数と値の変更(1)- 値指定

Sくん
でもこれが,ワープと何の関係があるんですか?
M先生
マウスで車を動かすと,座標の値が変わるのが分かったよね.逆に座標の値を変更できれば,オブジェクトを移動させることができる. そのためのタイルが,変数の「 変更タイル 」だよ.
Tさん
これですね.

M先生
この命令を実行すると,X座標の値が設定した数値に変更されるんだ.

M先生
まずは,実行すると車がスタート地点にワープするスクリプトを作ってみようか.
Sくん
えっと,スタート地点のX座標が分からないや.
Tさん
車をスタート地点に移動させて,ビューアーで確認すればいいじゃない.
Sくん
そうか.えっと,スタート地点のX座標は100だから...こうですね.

M先生
じゃあ次は,車が岩石と衝突したか調べて,衝突していたらワープするようにすればいいだけだよ.これは前のprojectの復習だね.
Sくん
はい.できました.

No. 4-1 やってみよう!

車を固定し,上から落下してくる岩石が車に衝突したら,岩石が落下開始地点に戻るようにしてみましょう.



No. 4-2 やってみよう!

車の重心を動かして,座標との関係を調べてみましょう.


ヒント

X,Y座標の値はオブジェクトのどの点の値でしょうか.重心を変更するとX,Y座標の値はどのように変わるか試してみるとよいでしょう. 重心についての解説は 節[方向と重心] にあります.



5.3 変数と値の変更(2)- 差分指定

M先生
今度は何をしているんだい?
Sくん
岩石が置いてあるだけではつまらないので,落石みたいにしようかと思って....
Tさん
男の子は好きだよねー,そういうの.
M先生
先生も好きだけどね.で,何か問題があるのかい?
Sくん
回転しながら落下するようにしたいんですが,回すと進めるを組み合わせても,やっぱり円を描くだけなんですよ.

M先生
そうだね.じゃあちょっとヒントを出してあげようか.「進む」タイルを使わないでオブジェクトを移動させるってことかな.
Tさん
さっき習った座標を使うんじゃないかな.Y座標をだんだんと減らしていけば,岩石は画面の上から下に進むはずだよ.
Sくん
そうか,こっちの変更タイルを使えばいいのか.

Sくん
あれ,岩石が真横に動くー.

Tさん
Y座標を減らせば下に落ちていくはずでしょ.落ち着きなさいよ.
Sくん
Y座標から5を引くことを繰り返せばいいんだ.「足す」とか「引く」とかは変更できるんだね.できたー.落石っぽい動きになったよ.

Tさん
あれ,お気に入りの落石が画面の外に行っちゃったよ.
Sくん
わー,どうしよう.先生助けてください.
M先生
落ち着いて.岩石のビューアーは開けるかい?オブジェクトが画面になくとも,画面の右端のタブをクリックすればビューアーが開けるはずだ.
Sくん
はい.あっ,Y座標が-100000になっている.まずはスクリプトを止めて,Y座標を画面内の値に変更すればいいんですね.
M先生
そうだね.
Tさん
もし,ビューアーが開けないときはどうしたらいいんですか?
M先生
その場合,ワールドのビューアーを開いて,「 遊び場 」カテゴリの「 迷子を連れ戻す 」を実行すればいいんだ.

No. 4-3 考えてみよう!

進める命令タイルだけでは,回転しながら落下する岩石を作れないのはなぜでしょうか?説明してみましょう.


ヒント

進めるタイルを使ったときにオブジェクトが進む方向はどうやって決まるのか考えてみるといいですね. オブジェクトの方向についての解説は 節[方向と重心] にあります.



No. 4-4 考えてみよう!

スクリプト1とスクリプト2で車の動きに違いはあるでしょうか.プログラムを実行する前に車の動きを予想してみましょう.



No. 4-5 やってみよう!

スクリプト1とスクリプト2で車の動きに違いはあるでしょうか.プログラムを実行して試してみましょう.



5.4 変数を使った場合分け

Sくん
うーん.これだとうまく動かないなー.
Tさん
どうしたの?
Sくん
車がワープするのと同じ要領で,岩石が繰り返し落ちてくるようにしたんだ.みてみて.

Tさん
すごいじゃん.それで?
Sくん
岩石の落下スピードを速くすると,うまくワープしなくなるんだ.どうしてかな?
Tさん
スクリプトが1回実行されると岩石は何ドット進む?
Sくん
200ドットかな.
Tさん
落下中は,ワープの開始地点に来たかどうか調べて,開始地点でなければ200ドット進む,を繰り返すよね.
Sくん
そうか.ワープの開始地点かどうかを調べるのは200ドットおきなんだね.
Tさん
ワープ開始地点の目印をもっと太くすればいいんじゃない?
Sくん
そうか...こうすれば,ああ,うまくいったね.

M先生
そういう方法もあるね.
Sくん
えっ先生,他に方法があるんですか?
M先生
座標を調べることができれば,同じことができるはずだね.
Tさん
落石のY座標がワープ開始地点の座標かどうかを調べればいいんですね.
M先生
そうだね.Y座標の変数タイルを直接スクリプトの中に入れてごらん.
Sくん
こうですね.

Sくん
あっ,タイルが変わった.

Tさん
これで,ワープ開始地点のY座標を入力すればできあがりだね.

No. 4-6 やってみよう!

落下するにしたがって,落石が大きくなっていくようにしてみましょう.


ヒント

オブジェクトのサイズを変更するには「幾何2(向きと大きさ)」カテゴリにある,拡大率を使うとよいでしょう. また,岩石がスタート地点に戻る時には,岩石の大きさを元に戻す必要があります.



練習問題

5.1

画面の左から右へ流れ続ける流れ星のアニメを作ってみましょう.


ヒント

1つ目が出来たらコピーをして,たくさんの流れ星を作りましょう.きれいですよ. 複数のスクリプトを一斉に実行するには,全スクリプトが便利です.全スクリプトについての解説が 節[全スクリプト] にあります.

5.2

座標制御だけを使って,以下のような図形を描いてみましょう.

  1. 四角形
  2. 階段
  3. 三角形を座標の制御だけで描くことができるかどうか考えてみましょう.

5.3

岩石にあたると車がワープするという例題を以下のように改造してみましょう.

  1. 上から降ってくる岩石にあたると,車がスピンするようにしてみましょう.
  2. リセットボタンを作って,押すと車がスタート位置に戻るようにしてみましょう.


ヒント

車が岩石に当たったときに1回だけスクリプトを実行してもうまくスピンさせられません. あるスクリプトを繰り返し実行できるようにするためには,スクリプトの操作カテゴリの命令タイルを使いましょう. スクリプトの操作カテゴリの解説が 節[スクリプトの操作] にあります.


ヒント

ボタンの使い方の解説が 節[ボタン] にあります.

5.4

星を使ったアニメーションを作ってみましょう.

  1. 星が消えたり現れたりする
  2. 星が黄色と赤色に点滅する


ヒント

色を変化させる場合は,色違いの星オブジェクトを2つ使います. 場合分けタイルを使って,画面外と画面内の座標に交互に移動させるようにします.

点滅の間隔をゆっくりするために刻み値を下げるとよいでしょう.刻み値についての解説は 節[刻み値] にあります.

5.5

スロットマシーンを作ってみましょう.


ヒント

図のように,絵柄を描いたパーツとカバーを組み合わせると簡単です. 絵柄が描いてあるオブジェクトを動かせば,絵柄が回転しているように見えますね.

5.6

本物と同じように時を刻むデジタル時計を作りましょう.

 ※ 部品フラップにある時計オブジェクトを使うのはダメですよ.


ヒント

文字盤を作るのには,テキストが便利です.テキストの解説は 節[テキスト] にあります.