今回は、前回作成した宇宙ロケットのプログラムを利用して、ロケットがドーナッツを食べまくるプログラムを作成します。
ただし、食べすぎると重くなって地球に帰還できなくなるので、食べた数をメモして5個より多くは食べられなくします。
ステップ1
- 前の「宇宙ロケット」プロジェクトを開いた状態で、メニューの[ファイル]-[コピーを保存]を実行します。
- 「プログラムのコピーが保存されました」と表示され、[プロジェクト名]に「宇宙ロケット copy」と自動で入力されるので、「ドーナッツを食べまくれ!」に変更します。これにより、「宇宙ロケット」プロジェクトのコピーが「ドーナッツを食べまくれ!」という名前で作成できたことになります。
- [スプライトリスト]の[スプライトを選ぶ]からスプライトライブラリを表示し、[検索]にdonuを入力するなどして、Donutスプライトをプロジェクトに読み込みます。
- DonutスプライトをクリックしてDonutスプライトのコードエリアを表示します。
- [緑の旗が押されたとき]をドラッグ&ドロップします。
- ドーナッツがずいぶん大きいので小さくします。そのためには[見た目]-[大きさを(100)%にする]をドラッグ&ドロップし、100を25に変更します(半角)
- 「ロケットがドーナッツを食べる」ことは、ロケットがドーナッツと接触したら、ドーナッツを消すことで表すことにします。[制御]-[もし( )なら]ブロックをドラッグ&ドロップします。
- [もし( )なら]の六角形に、[調べる]-[(マウスのポインター)に触れた]をドラッグ&ドロップし、三角マークのクリックで表示されるメニューから[Rocketship]をクリックして選択します。
- ただしこのチェックは、当たっているかどうかを行うものなので、ずっと実行をつづける必要があります。そのためには、[もし( )なら]ブロックを[ずっと]ブロックの中に入れます。


この接触はゲームで言う衝突で、衝突したかどうかを調べるテクニックは当たり判定と呼ばれます。

[(マウスのポインター)に触れた]ブロックは、このブロックを設定するスプライト(今の場合ならDonut)と、ブロックの( )内に設定するもの(今の場合なら、マウスのポインター(カーソルのこと)、端(ステージの枠のこと)、Rocketship(プロジェクトに含まれるスプライト))が当たったかどうかを調べ、当たったらTRUE、当たっていない場合はFALSEを返します。
TRUEを返すというのはプログラミング独特の言い方で、条件の六角形の部分((Rocketship)に触れた)がTRUEになりことです。ドーナッツがスプライトに触れたらこの条件はTRUEになるので、[もし( )なら]ブロックのへこみに入れたコードブロックが実行されます。触れていない場合はFALSEになるので、へこみに入れたコードは実行されません。

ステップ2
もしドーナッツがロケットと接触したら、ドーナッツが消え、ロケットがドーナッツを食べたように見せるようにしましょう。[もし([(Rocketship)に触れた)なら]ブロックのへこみにコードブロックを追加します。
- ドーナッツを非表示にします([隠す]をドラッグ&ドロップ)。
- 1秒待ちます([(1)秒待つ]をドラッグ&ドロップ)
- ドーナッツをステージのどこか別の場所に移動させます([動き]-[(どこかの場所)へ行く]をドラッグ&ドロップ)
- ドーナッツを表示します([表示する]をドラッグ&ドロップ)
- プログラムを実行し、矢印キーを使ってロケットをドーナッツに当ててみます。ゲームをやっているような感覚が得られます。
- このプログラムは終了しないので、終了するときには赤丸の[止める]ボタンをクリックします。

[(どこかの場所)へ行く]は、このブロックが設定されたスプライトをステージ上のランダムな座標に移動させます。これは次のドーナッツを出現させるための準備です。実際には1つのスプライトを消して、ランダムな場所に移し、そこで表示することで、次々と新しいドーナッツが現れるように見せています。
[スプライトリスト]には名前やxy位置、表示するかどうか、大きさ、向きなど、[スプライトリスト]で選択しているスプライトの情報が表示されます。こうした情報はそのスプライトの属性(プロパティ)と呼ばれます。Rocketshipを選択してキーボードで位置を変えると、[スプライトリスト]の[X]と[y]にはその時々の座標がリアルタイムで表示されます。またDonutを選択し、ロケットを操作すると、[スプライトリスト]の[表示する]が、ドーナッツのその時々の状態によって、[スプライトを表示する]と[スプライトを隠す]に切り替わります。
ステップ3
ロケットがドーナッツを食べるトリックができたので、次は食べたドーナッツの数をメモする方法を考えましょう。これには変数を使用します。
- ドーナッツの数を数えるので、数値を扱う変数にします。
- プログラムのスタート時、ドーナッツはまだ1個も食べられていないので、変数の値は0にします。
- ドーナッツが食べられたら、そのたびに今のドーナッツの数に1を足します。
これだけ見ると、少し難しく思えるかもしれませんが、プログラムが実際に行うことは単純です。
- [変数]-[変数を作る]ボタンをクリックし、donutsという名前で新しい変数を作成します。
- Donutスプライトのスクリプトで、[緑の旗が押されたとき]と[ずっと]ブロックの間に、[変数][(donuts)を(0)にする]ブロックをドラッグ」&ドロップします。
- [もし( )なら]ブロックの最初に、[変数]-[(donuts)を(1)ずつ変える]を挿入します。
- プログラムを実行します。ロケットがドーナッツを食べるたびに、ステージ左上に表示される変数donutsの値が1ずつ大きくなることを確認します。
これでドーナッツを数を追えるようになりました。

[緑の旗が押されたとき]と[ずっと]ブロックの間に入れたコードブロックは1回だけ実行されることになります。変数donutsは1回だけ0にしたいので、ここに挿入します。変数に最初の値を入れることを変数の初期化と言います。

donutsを0にする変数の初期化はプログラムのスタート時に行います。これの理解はそう難しくはないと思いますが、どのスプライトのどのタイミングで、donutsに1を足すのかを決めるのはそう簡単ではありません。
今の場合で言うと、ドーナッツが食べられたとき、つまりドーナッツが非表示になったときが適切です。それはDonutスプライトのスクリプトで行っているので、そこにコードブロックを挿入するのが理にかなっています。
ステップ4
最後に、ドーナッツを5個たべたらそれより多く食べられないようにしましょう。具体的に言うと、変数donutsの値が5になったら、ロケットに「もうお腹いっぱい!」と言わせてプログラムを終わるようにします。
この「変数donutsの値が5になったら」は条件で表すことができます。donutsの値をずっと調べつづけ、それが5になったら条件がTRUEになるので、「ロケットに「もうお腹いっぱい!」と言わせ」「プログラムを終わる」ようにします。
スクリプトはDonutでもステージでも作成できますが、ロケットが「もうお腹いっぱい!」と言うので、Rocketshipにしましょう。
- Rocketshipスプライトのコードエリアを開き、新しい[緑の旗が押されたとき]を追加します。これは3つめの[緑の旗が押されたとき]ブロックになります。
- [ずっと]ブロックをドラッグ&ドロップし、その中に[もし( )なら]をドラッグ&ドロップします。
- [演算]-[( ) = (50) ]条件ブロックを、[もし( )なら]の六角形にドラッグ&ドロップします。
- [変数]-(donuts)を、[( ) = (50) ]条件ブロックの左の( )にドラッグ&ドロップします。
- 50を半角の5に変更します。
- [見た目]-[(こんにちは!)と(2)秒言う]を[もし( )なら]のへこみにドラッグ&ドロップし、文字を「もうお腹いっぱい!」に変更します。
- [制御]-[(すべてを止める)]を(6)の下にドラッグ&ドロップします。


[(すべてを止める)]はプログラムで実行されているすべてのスクリプトをすぐに停めます。
ここまでのプログラムはこのリンクからダウンロードできます。