2011.10.25
今回からは少し長めのプログラムに挑戦していこう。次回(最終回)ではゲームを作る予定なので、今回はその準備をするために簡単なゲームをScratchで作成する方法を解説していきたい。
実際の手順に入る前に、今回のレッスンで特に重要な要点3つを少し解説しておきたい。
まず、重要なのは、キーボードなどのイベントを拾ってプログラムの動きを変える方法だ。スクリプトを複数用意しておき、キーボードの何処キーが押された かによって実行されるスクリプトを切り替える。ゲームなどのプログラムを作るには、プレイヤーの操作をキーボードかマウスで受け取ることが必須になってく る。そのための方法を覚えよう。
そして「メッセージ」という考え方についても知っておきたい。これを使って、今まで1つのカタマリとして組み立ててきたスクリプトを、複数のスクリプトで組み立てるようにしてみる。つまり、1つだったものをいくつにも分割してゆくのだ。
何故プログラムを分割する必要があるのか。実は、スクリプトは分割することで大幅に見やすくなることがあるからだ。これまでの方法の延長線でスクリプト を組み立てていくと、複雑なプログラムを作っていくと繰り返しなどの処理が何重にも重なってしまうことがよくある。また、1つのスクリプトの中で同じ手順 のスクリプトを何度も組み立てる必要が出てきてしまうかもしれない。
そこで、プログラムを小さなまとまりごとに分割して作り、必要に応じてそれを呼び出すようにする。こうすることで分けた小さなスクリプトが本体のルーチ ンと別れてスクリプトが小さく・読みやすくなるうえに、同じ処理を何度も組み立てる必要がなくなって短くなる。結果的にぱっと見たときに理解しやすくなる はずだ。
また、もう1つのメッセージの使い方として、オブジェクトに相互関係をもたせる方法についても学んでいこう。今までの練習プログラムではオブジェクト (絵)は1つだけだったが、これを複数使っていくことにして、さらにこれらを連携しながら動かすのだ。当然であるが、ゲームを作るためには1つのオブジェ クトが動くだけでつまらない。このやり方を覚えれば、銃からタマを飛ばすなんてこともできる。
①今回はインベーダーゲームのようなものを作りたいので、砲台風の絵を描いてオブジェクトを作る。また、回転や方向を都合のよいように変えておく。
②これにキーボード入力を対応させていく。[制御]から[□が押されたとき]のブロックを持ってこよう。見た目が今まで使ってきた「[旗]がクリックされ たとき」に近いが、動作も似ている。「[旗]がクリックされたとき」の場合は旗がクリックされたときにそれに続くプログラムがスタートしていたが、こちら は指定したキーが叩かれたときに実行されるのだ。インベーダーでは砲台が左右に動く必要があるので、右向き矢印と左向き矢印キーにそれぞれ動作を割り当て よう。さて、砲台を左右に動かすことはできただろうか?
③敵となるUFOを作っておこう。[新しいスプライト]をクリックしてUFOのようなモノを描き、①と同じように設定しておく。このとき、砲台オブジェク トに書いたスクリプトが見えなくなってしまうが心配いらない。砲台をクリックすれば以前に作ったスクリプトはまた見えるようになる。これはオブジェクトそ れぞれがスクリプトを持っているためだ。個々のオブジェクトごとに、そのオブジェクトのスプライト(絵)がどのように動くかのスクリプトを持っている。こ の事は重要なのでよく覚えておこう。
④では、このUFOの動きを定義していく。ここでは少し複雑に動くようにしてみたい。上のプログラムを見てみてほしい。乱数を使うことで、右上(70度)、右下(110度)、左上(-110度)、左下(-70度)の4方向に動くようにプログラムしてみた。
⑤しかし、④のプログラムは何重にも重なりがあって見づらく、意味が読み取るのも大変だろう。そこで、メッセージを使ってスクリプトを分割して読みやすく してみよう。ここでは特に移動するスクリプト部分を外へ切り出したい。[制御]から[□を送って待つ]を取り出してみよう。これをメッセージの名前を自分 で決めなければならないので、□のクリックメニュー[新規]から図のように適切な名前を付け、これを先ほどまで回転と移動が入っていた部分に挿し込む。さ らに、同じく制御から[□を受け取った時]ブロックを持ってきて、これに先ほどまで使っていた移動スクリプトをひっつける。以前と同じ動きになっただろ う。デバッグモードで見てみると、[~へ送って待つ]に来たときに[~を受け取った時]に移動しているのがよくわかるはずだ。
⑥さて、ここまでで砲台の動きとUFOの動きは完成した。これから砲台が弾丸を発射するようにしていきたい。まずは弾丸の絵を書いてオブジェクトを作っておこう。
⑦これを撃ち出すようにしたい。順番に動きを作っていこう。まず、弾丸の動きを考えよう。弾丸は、上にまっすぐ飛んでいくはずなので、そのように動くよう にスクリプトを作ってみよう。これは単純に飛んでいくだけだけなので、後で大きく変えてしまうが、その基本はこれだけだ。
⑧次に弾丸がどのように発射されるかを考えたい。これは発射ボタン(今回は"上向き矢印キー")が押されたタイミングで砲台の位置から上向きに飛んでいけ ば(発射されれば)よさそうだ。そこで、砲台オブジェクトよりさきほど使った「メッセージ」を利用して弾丸オブジェクトの処理を開始するようにする。まず は砲台に現在の2つに加えて上のようなスクリプトを追加する。
⑨弾丸側にスクリプトを追加していく。まず、今「旗」がクリックされたときに動く[ずっと]のスクリプトを[弾丸を発射]を受け取ったときに動くようにし よう。そして、弾丸を発射剃る前に砲台の位置へ移動するようにする。また、弾丸は発射まで隠されているべきである。そこで旗を押してプログラムがスタート したときにこれを隠すように、[弾丸を発射]メッセージの受信で表示するようにする。すると、スクリプトはこのような形になるはずだ。
弾丸オブジェクト
⑩ここまで来ると、砲台が移動して弾が飛ばせる。かなり「できた!」というイメージが強くなってきたのではないだろうか。あとは弾丸がUFOにあたったと きにUFOが消えればよい。ここでもあえてメッセージを使って解決してみよう。上のスクリプトを見ながら動作を想像して理解してほしい。
今回はとてもシンプルで得点計算やリセットもないインベーダーゲームを作った。
これはこれで遊べるが、やはりすこし味気ない。
次回では、そういう部分も作りこんだ「ゲーム」を作ってみたい。
京都クリエイティブワークショップについて
京都クリエイティブワークショップは、 ScratchやViscuitといったグラフィカル・プログラミング環境を用いて小中学生などにゲームづくり体験ワークショップ(公開講座)を開くこと を目的とした学生団体です。高校生を中心に、大学生・高専生などで構成されています。ターゲット年齢が夏休みとなるオープンソースカンファレンスin京都 においては、セミナー形式でワークショップを開催する予定です。URL:http://pwsk.cosmio.net/