Scratchでカジュアルゲーム (1) 風船ゲーム
はじめに
CoderDojoというボランティア団体で、子供達のプログラミングスキル習得の支援をしております。プログラミングの開発環境は、主にScratchを使っていますが、いちからScratchでプログラミングするハードルも結構高いので、気軽にリミックスできる教材を作ってみました。
風船ゲーム
作った教材はこちら。
風船をウチワであおいで器に入れるステージクリア型のゲームです。障害物に当たると風船が割れてゲームオーバーとなります。極力シンプルな作りにしましが、風船の浮遊感を出すために物理挙動のコードがやや複雑です。子供達がScratchに慣れてきたら、コードを読み解く練習にもなるかなと思います。
この教材ではScratchの以下の機能を活用しています;
- クローン: ウチワであおいだ時に発生する風を生成します。
- ブロック定義: 風船の物理挙動や、ゲームオーバー時の再挑戦処理をまとめて定義します。
- メッセージを送る: ゲームオーバーや再挑戦、次のステージへの移行など、スプライト間の連携に使用します。
- 幽霊の効果を変える: 風船が割れた時のアニメーションに使用します。
リミックスのアイディア
初期設定では6ステージ用意しています。特に第4ステージを難易度高く設定しています。一通り遊んだ後で、
アイディア | 説明 |
---|---|
独自のステージを追加する | 「ステージ」スプライトにコスチュームを追加することで、新しいステージを簡単に追加できます。 |
ステージすべてクリアしたらゲームコンプリートのメッセージを表示する | 初期設定ではステージ6までクリアすると最初のステージに戻ってしまいますが、すべてのステージをクリアしたらコンプリートのメッセージを表示するようにしてみましょう。 |
BGMや効果音を追加する | 風船が割れた時の効果音やBGMを追加することでより臨場感あふれるゲームになります。 |
風船のスプライトを変更する | 風船を動物やキャラクターの風船に変更することで、ゲームの雰囲気を変えてみましょう。 |
風船に物理挙動を追加する | 風が当たった時に風船が回転するなど、風船に物理挙動を追加する。 |
など、色々リミックスして楽しんでみましょう。
プログラムの概要説明
主要なコードは「風船」スプライトで実装しています。ここでは全体の構成を説明しますが、特に風船の物理挙動のコードは複雑なため、詳細は次の章で説明します。
スプライト | コード概要 |
---|---|
風船 | 風船の上下移動、風が当たった時の処理等の物理挙動、メッセージの送信(次のステージ 、ゲームオーバー表示完了 )、メッセージ処理(風にあたった 、次のステージ 、再挑戦 、ゴール 、ゲームオーバー )、等、風船ゲームの主要な処理を行います。 |
うちわ | ウチワの移動処理と風の生成を行います。 |
風 | 風の移動と風船に触れた際の風にあたった メッセージ送信、端に触れた際の削除処理を行います。 |
器、器の前面 |
再挑戦 、次のステージ を受け取った時の復帰処理、風船が器に入った時のゴール メッセージ送信を行います。 |
ステージ | 風船と障害物との当たり判定とゲームオーバー メッセージ送信、再挑戦 を受け取った時の復帰処理、次のステージ を受け取った時のステージ移行の処理を行います。 |
ゲームオーバー |
ゲームオーバー を受け取った時の表示とそゲームオーバー表示完了 の非表示処理、再挑戦 メッセージ送信を行います。 |
ゲームクリア |
ゴール を受信した時にゲームクリアを表示、次のステージ を受け取った時にゲームクリアを隠す処理を行います。 |
地面、左壁、右壁、天井 | 旗が押された時にドラッグができないようにしています。 |
スプライト間のメッセージのやりとりを図示すると以下のようになります。Scratchはイベントドリブンの言語で、メッセージのやりとりを理解することで、プログラムの流れが理解しやすくなります。
風船の物理挙動の実装
風船の物理挙動は、上下の移動
ブロック定義、左右の移動
ブロック定義、「風にあたった」を受け取った時
のイベント処理、の3つで構成されています。これらの処理の中で使われているスプライトと変数は上図の通りです。処理はすべて風船
スプライトに実装されています。
それぞれの詳細は以下の通りです。Scratchのコードを見ながら読むと理解しやすいかと思います。
上下の移動
風の影響と重力の計算
- 風船は、
上下の移動
ブロック定義のループの中で落下速度
分毎回上下に移動します。 -
落下速度
は風に当たると3
もしくは2
になり、上に毎回3
もしくは2
ずつ移動します。 - ただし、重力があるので毎回
0.05
ずつ落下速度
は減少させ、マイナスになると今度は下向きに移動するようになります。
天井に触れた時の処理
- 天井に触れた場合は、跳ね返る処理として、
落下速度
を半分にしてマイナスにして下に移動するようにします。 - この際、
落下速度
の関係で、天井に風船がめり込んでいる場合があるため、一度天井に触れたら、天井に触れているか
のフラグを立てて、フラグが立っている間は落下速度
の再計算をしないようにしています。
床に触れた時の処理
- 床に触れた場合は、跳ね返る処理として、
落下速度
を半分にしてマイナスにして下に移動するようにします。 - 但し、
落下速度
の絶対値が0.5
より小さい場合は、落下速度
を0
にして上下に動かないようにしています。 - また、
落下速度
の関係で、床に風船がめり込んでいる場合があるため、一度床に触れたら、床に触れているか
のフラグを立てて、フラグが立っている間は落下速度
の再計算をしないようにしています。
左右の移動
風の影響と空気摩擦の計算
- 風船は、
左右の移動
ブロック定義のループの中で移動速度
分毎回左右に移動します。 -
移動速度
は風に当たると2
もしくは-2
になり、左右に毎回2
もしくは-2
ずつ移動します。 - 但し、空気摩擦があるので毎回
0.01
ずつ移動速度
は減少させ、移動速度の絶対値が0.2
より小さい場合は、移動速度
を0
にして左右に動かないようにしています。
左右の壁に触れた時の処理
- 左右の壁に触れた場合は、跳ね返る処理として、
移動速度
を半分にして反転させます。 - この際、
移動速度
の関係で、壁に風船がめり込んでいる場合があるため、一度壁に触れたら、左壁/右壁に触れているか
のフラグを立てて、フラグが立っている間は移動速度
の再計算をしないようにしています。
「風にあたった」を受け取った時
風船
と風
があたった時、
- 風がほぼ風船の真下にあたった場合(
風
と風船
のx座標の差の絶対値が10
より小さい場合)は、落下速度
を3
にします。移動速度
は変更しません。 - 風が風船の左側にあたった場合(「
風
のx座標」-「風船
のx座標」が-10
以下の場合)、移動速度
を2
(右に移動)します。 - 風が風船の右側にあたった場合(「
風
のx座標」-「風船
のx座標」が10
以上の場合)、移動速度
を-2
(左に移動)します。 - 2,3の場合で、天井に触れていない場合に
落下速度
を2
(上に移動)にします。
おわりに
お疲れ様でした。ちょっと風船の物理挙動のコードが複雑ですが、壁や床、天井との跳ね返りのフラグ処理がわかりにくいだけで、それを除くと、基本的な物理挙動のコードはシンプルです。
是非、りミックスに挑戦して、より楽しいゲームにしてみてください!
Discussion